Spark SQL常用表達式示例

Spark SQL常用表達式示例

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。

手動碼字不易,請大家尊重勞動成果,謝謝

作者:http://blog.csdn.net/wang_wbq

本文使用spark-shell來演示我平時常用的一些Spark SQL表達式,來幫助大家更好體會Spark SQL的使用方式。

所有可用函數可以使用這篇文章中的方法進行查看:https://blog.csdn.net/wang_wbq/article/details/79672012

以下爲官方文檔中取DataFrame中的其中幾列、進行簡單運算、過濾、分組合並的示例,以使大家對selectfiltergroupBy等方法有個初步的認識。

// This import is needed to use the $-notation
import spark.implicits._
// Print the schema in a tree format
df.printSchema()
// root
// |-- age: long (nullable = true)
// |-- name: string (nullable = true)

// Select only the "name" column
df.select("name").show()
// +-------+
// |   name|
// +-------+
// |Michael|
// |   Andy|
// | Justin|
// +-------+

// Select everybody, but increment the age by 1
df.select($"name", $"age" + 1).show()
// +-------+---------+
// |   name|(age + 1)|
// +-------+---------+
// |Michael|     null|
// |   Andy|       31|
// | Justin|       20|
// +-------+---------+

// Select people older than 21
df.filter($"age" > 21).show()
// +---+----+
// |age|name|
// +---+----+
// | 30|Andy|
// +---+----+

// Count people by age
df.groupBy("age").count().show()
// +----+-----+
// | age|count|
// +----+-----+
// |  19|    1|
// |null|    1|
// |  30|    1|
// +----+-----+

1、字符串過濾

這種方式可以使用SQL查詢中的LIKE語法

scala> df.show
+-------+---+
|   name|age|
+-------+---+
|   Mike|  4|
|Michael|  6|
|  Peter|  3|
|   Andy|  5|
+-------+---+


scala> df.filter("like(name, 'M%')").show
+-------+---+
|   name|age|
+-------+---+
|   Mike|  4|
|Michael|  6|
+-------+---+

//較老的版本只支持此種方式
scala> df.filter("name LIKE 'M%'").show
+-------+---+
|   name|age|
+-------+---+
|   Mike|  4|
|Michael|  6|
+-------+---+

2、字符串分割與數組取值

我們可以使用split(str, reg)函數來分割字符串,注意第二個參數是正則表達式

數組取值有兩種方式,一種是在字符串表達式中使用[序號],或者在代碼中使用Column類的apply方法(序號)。簡而言之就是在字符串裏用方括號,在字符串外用圓括號

scala> df.show
+-------------------+-----+
|               time|value|
+-------------------+-----+
|2018-01-01 09:00:00|    1|
|2018-01-01 09:00:00|    2|
|2018-01-01 10:00:00|    3|
|2018-01-03 11:00:00|    4|
|2018-01-01 12:00:00|    5|
|2018-01-06 13:00:00|    6|
|2018-01-09 14:00:00|    7|
|2018-01-08 15:00:00|    8|
|2018-01-02 09:00:00|    1|
|2018-01-02 09:00:00|    2|
|2018-01-03 10:00:00|    3|
|2018-01-07 11:00:00|    4|
|2018-01-06 12:00:00|    5|
|2018-01-09 13:00:00|    6|
|2018-01-04 14:00:00|    7|
|2018-01-02 15:00:00|    8|
+-------------------+-----+

scala> df.select(col("*"), expr("split(time, ' ')[0]").as("day")).show
+-------------------+-----+----------+
|               time|value|       day|
+-------------------+-----+----------+
|2018-01-01 09:00:00|    1|2018-01-01|
|2018-01-01 09:00:00|    2|2018-01-01|
|2018-01-01 10:00:00|    3|2018-01-01|
|2018-01-03 11:00:00|    4|2018-01-03|
|2018-01-01 12:00:00|    5|2018-01-01|
|2018-01-06 13:00:00|    6|2018-01-06|
|2018-01-09 14:00:00|    7|2018-01-09|
|2018-01-08 15:00:00|    8|2018-01-08|
|2018-01-02 09:00:00|    1|2018-01-02|
|2018-01-02 09:00:00|    2|2018-01-02|
|2018-01-03 10:00:00|    3|2018-01-03|
|2018-01-07 11:00:00|    4|2018-01-07|
|2018-01-06 12:00:00|    5|2018-01-06|
|2018-01-09 13:00:00|    6|2018-01-09|
|2018-01-04 14:00:00|    7|2018-01-04|
|2018-01-02 15:00:00|    8|2018-01-02|
+-------------------+-----+----------+


scala> df.select(col("*"), expr("split(time, ' ')")(0).as("day")).show
+-------------------+-----+----------+
|               time|value|       day|
+-------------------+-----+----------+
|2018-01-01 09:00:00|    1|2018-01-01|
|2018-01-01 09:00:00|    2|2018-01-01|
|2018-01-01 10:00:00|    3|2018-01-01|
|2018-01-03 11:00:00|    4|2018-01-03|
|2018-01-01 12:00:00|    5|2018-01-01|
|2018-01-06 13:00:00|    6|2018-01-06|
|2018-01-09 14:00:00|    7|2018-01-09|
|2018-01-08 15:00:00|    8|2018-01-08|
|2018-01-02 09:00:00|    1|2018-01-02|
|2018-01-02 09:00:00|    2|2018-01-02|
|2018-01-03 10:00:00|    3|2018-01-03|
|2018-01-07 11:00:00|    4|2018-01-07|
|2018-01-06 12:00:00|    5|2018-01-06|
|2018-01-09 13:00:00|    6|2018-01-09|
|2018-01-04 14:00:00|    7|2018-01-04|
|2018-01-02 15:00:00|    8|2018-01-02|
+-------------------+-----+----------+

3、字符串替換

字符串替換共有兩種方式,regexp_replacereplace。從名字可以看出,regexp_replace是支持正則表達式的,replace是普通字符串替換。

scala> df.show
+-------------------+-----+
|               time|value|
+-------------------+-----+
|2018-01-01 09:00:00|    1|
|2018-01-01 09:00:00|    2|
|2018-01-01 10:00:00|    3|
|2018-01-03 11:00:00|    4|
|2018-01-01 12:00:00|    5|
|2018-01-06 13:00:00|    6|
|2018-01-09 14:00:00|    7|
|2018-01-08 15:00:00|    8|
|2018-01-02 09:00:00|    1|
|2018-01-02 09:00:00|    2|
|2018-01-03 10:00:00|    3|
|2018-01-07 11:00:00|    4|
|2018-01-06 12:00:00|    5|
|2018-01-09 13:00:00|    6|
|2018-01-04 14:00:00|    7|
|2018-01-02 15:00:00|    8|
+-------------------+-----+

scala> df.select(col("*"), expr("regexp_replace(time, '[-: ]', '@')").as("replace")).show
+-------------------+-----+-------------------+
|               time|value|            replace|
+-------------------+-----+-------------------+
|2018-01-01 09:00:00|    1|2018@01@01@09@00@00|
|2018-01-01 09:00:00|    2|2018@01@01@09@00@00|
|2018-01-01 10:00:00|    3|2018@01@01@10@00@00|
|2018-01-03 11:00:00|    4|2018@01@03@11@00@00|
|2018-01-01 12:00:00|    5|2018@01@01@12@00@00|
|2018-01-06 13:00:00|    6|2018@01@06@13@00@00|
|2018-01-09 14:00:00|    7|2018@01@09@14@00@00|
|2018-01-08 15:00:00|    8|2018@01@08@15@00@00|
|2018-01-02 09:00:00|    1|2018@01@02@09@00@00|
|2018-01-02 09:00:00|    2|2018@01@02@09@00@00|
|2018-01-03 10:00:00|    3|2018@01@03@10@00@00|
|2018-01-07 11:00:00|    4|2018@01@07@11@00@00|
|2018-01-06 12:00:00|    5|2018@01@06@12@00@00|
|2018-01-09 13:00:00|    6|2018@01@09@13@00@00|
|2018-01-04 14:00:00|    7|2018@01@04@14@00@00|
|2018-01-02 15:00:00|    8|2018@01@02@15@00@00|
+-------------------+-----+-------------------+


scala> df.select(col("*"), expr("replace(time, ':', '@')").as("replace")).show
+-------------------+-----+-------------------+
|               time|value|            replace|
+-------------------+-----+-------------------+
|2018-01-01 09:00:00|    1|2018-01-01 09@00@00|
|2018-01-01 09:00:00|    2|2018-01-01 09@00@00|
|2018-01-01 10:00:00|    3|2018-01-01 10@00@00|
|2018-01-03 11:00:00|    4|2018-01-03 11@00@00|
|2018-01-01 12:00:00|    5|2018-01-01 12@00@00|
|2018-01-06 13:00:00|    6|2018-01-06 13@00@00|
|2018-01-09 14:00:00|    7|2018-01-09 14@00@00|
|2018-01-08 15:00:00|    8|2018-01-08 15@00@00|
|2018-01-02 09:00:00|    1|2018-01-02 09@00@00|
|2018-01-02 09:00:00|    2|2018-01-02 09@00@00|
|2018-01-03 10:00:00|    3|2018-01-03 10@00@00|
|2018-01-07 11:00:00|    4|2018-01-07 11@00@00|
|2018-01-06 12:00:00|    5|2018-01-06 12@00@00|
|2018-01-09 13:00:00|    6|2018-01-09 13@00@00|
|2018-01-04 14:00:00|    7|2018-01-04 14@00@00|
|2018-01-02 15:00:00|    8|2018-01-02 15@00@00|
+-------------------+-----+-------------------+

scala> df.select(col("*"), expr("regexp_replace(time, '([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})', '$1~$2~$3%$4-$5-$6')").as("replace")).show
+-------------------+-----+-------------------+
|               time|value|            replace|
+-------------------+-----+-------------------+
|2018-01-01 09:00:00|    1|2018~01~01%09-00-00|
|2018-01-01 09:00:00|    2|2018~01~01%09-00-00|
|2018-01-01 10:00:00|    3|2018~01~01%10-00-00|
|2018-01-03 11:00:00|    4|2018~01~03%11-00-00|
|2018-01-01 12:00:00|    5|2018~01~01%12-00-00|
|2018-01-06 13:00:00|    6|2018~01~06%13-00-00|
|2018-01-09 14:00:00|    7|2018~01~09%14-00-00|
|2018-01-08 15:00:00|    8|2018~01~08%15-00-00|
|2018-01-02 09:00:00|    1|2018~01~02%09-00-00|
|2018-01-02 09:00:00|    2|2018~01~02%09-00-00|
|2018-01-03 10:00:00|    3|2018~01~03%10-00-00|
|2018-01-07 11:00:00|    4|2018~01~07%11-00-00|
|2018-01-06 12:00:00|    5|2018~01~06%12-00-00|
|2018-01-09 13:00:00|    6|2018~01~09%13-00-00|
|2018-01-04 14:00:00|    7|2018~01~04%14-00-00|
|2018-01-02 15:00:00|    8|2018~01~02%15-00-00|
+-------------------+-----+-------------------+

4、結構體數據的索引

由於本節較複雜,爲了防止篇幅太長影響閱讀體驗,因此新開了一個博客來介紹:https://blog.csdn.net/wang_wbq/article/details/79675522

5、集合數據類型的索引

由於本節較複雜,爲了防止篇幅太長影響閱讀體驗,因此新開了一個博客來介紹:https://blog.csdn.net/wang_wbq/article/details/79678168

未完待續~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章