環(huán)境說明:
用的版本是Spark 2.1,Dataset操作很豐富,join的支持也蠻好的,比原來用的spark 1.4好用多了。
嗯,Dataset操作,我覺得最重要的是把Column類的用法弄清楚。畢竟,后面的Dataset操作都是在操作列。最好的資料自然是官方文檔,Spark的API文檔還是挺詳細(xì)的,而且還細(xì)分了Java/Scala/Python。
來個(gè)例子邊看邊說:
scala> val df = spark.createDataset(Seq( ('aaa', 1, 2), ('bbb', 3, 4), ('ccc', 3, 5), ('bbb', 4, 6)) ).toDF('key1','key2','key3')df: org.apache.spark.sql.DataFrame = [key1: string, key2: int ... 1 more field]
scala> df.printSchemaroot |-- key1: string (nullable = true) |-- key2: integer (nullable = false) |-- key3: integer (nullable = false)scala> df.collectres34: Array[org.apache.spark.sql.Row] = Array([aaa,1,2], [bbb,3,4], [ccc,3,5], [bbb,4,6])
上面的代碼創(chuàng)建了一個(gè)DataFrame,有三列,列名分別是key1, key2, key3, 類型對(duì)應(yīng)string, integer, integer。
當(dāng)前造了4條記錄,如上所示。
接下來看看選擇列的幾種調(diào)用方式:
scala> df.select('key1').collectres49: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb])scala> df.select($'key1').collectres50: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb])scala> df.select(df.col('key1')).collectres51: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb])
select方法中參數(shù)直接用字符串只能用DataFrame中的命名字段名。不能對(duì)字段名再使用像SQL的select語法的表達(dá)式。但是$'key1'這種寫法對(duì)應(yīng)的是select方法的Column參數(shù)類型重載,可以支持sql的select語法了:
scala> df.select(upper($'key1')).collectres58: Array[org.apache.spark.sql.Row] = Array([AAA], [BBB], [CCC], [BBB])scala> df.select(upper('key1')).collect<console>:27: error: type mismatch; found : String('key1') required: org.apache.spark.sql.Column df.select(upper('key1')).collect
上面在select中對(duì)字段key1調(diào)用了upper函數(shù)轉(zhuǎn)換大小寫,注意'key1'前面有個(gè)$符號(hào),這個(gè)是scala最喜歡搞的語法糖,了解下寫代碼會(huì)很方便。而下面沒有加$符號(hào)在key1前面時(shí)就報(bào)錯(cuò)了,提示需要的是Column,而當(dāng)前給的則是個(gè)String類型。
這時(shí)候的select也可以用selectExtr方法替換。比如下面的調(diào)用:
scala> df.selectExpr('upper(key1)', 'key2 as haha2').show+-----------+-----+|upper(key1)|haha2|+-----------+-----+| AAA| 1|| BBB| 3|| CCC| 3|| BBB| 4|+-----------+-----+
key1字段調(diào)用了變大寫的函數(shù),而key2字段改了別名haha2, ok, 一切順利!
嗯,先寫到這吧,困了。。?;仡^再接著寫~~
聯(lián)系客服