你好,游客 登录
背景:
阅读新闻

Spark的Dataset操作(一)-列的选择select

[日期:2017-09-29] 来源:csdn  作者:野男孩 [字体: ]

环境说明:

用的版本是Spark 2.1,Dataset操作很丰富,join的支持也蛮好的,比原来用的spark 1.4好用多了。

 

嗯,Dataset操作,我觉得最重要的是把Column类的用法弄清楚。毕竟,后面的Dataset操作都是在操作列。最好的资料自然是官方文档,Spark的API文档还是挺详细的,而且还细分了Java/Scala/Python。


来个例子边看边说:


  1. scala> val df = spark.createDataset(Seq( 
  2.             ("aaa", 1, 2),    ("bbb", 3, 4),    ("ccc", 3, 5),    ("bbb", 4, 6)) 
  3.         ).toDF("key1","key2","key3") 
  4. df: org.apache.spark.sql.DataFrame = [key1: string, key2: int ... 1 more field] 
 
  1. scala> df.printSchema 
  2. root 
  3.  |-- key1: string (nullable = true) 
  4.  |-- key2: integer (nullable = false) 
  5.  |-- key3: integer (nullable = false) 
  6. scala> df.collect 
  7. res34: Array[org.apache.spark.sql.Row] = Array([aaa,1,2], [bbb,3,4], [ccc,3,5], [bbb,4,6]) 


上面的代码创建了一个DataFrame,有三列,列名分别是key1, key2, key3, 类型对应string, integer, integer。
当前造了4条记录,如上所示。


接下来看看选择列的几种调用方式:

 

 
  1. scala> df.select("key1").collect 
  2. res49: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb]) 
  3.  
  4. scala> df.select($"key1").collect 
  5. res50: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb]) 
  6.  
  7. scala> df.select(df.col("key1")).collect 
  8. res51: Array[org.apache.spark.sql.Row] = Array([aaa], [bbb], [ccc], [bbb]) 


select方法中参数直接用字符串只能用DataFrame中的命名字段名。不能对字段名再使用像SQL的select语法的表达式。但是$"key1"这种写法对应的是select方法的Column参数类型重载,可以支持sql的select语法了:

 

  1. scala> df.select(upper($"key1")).collect 
  2. res58: Array[org.apache.spark.sql.Row] = Array([AAA], [BBB], [CCC], [BBB]) 
  3.  
  4. scala> df.select(upper("key1")).collect 
  5. <console>:27: error: type mismatch; 
  6.  found   : String("key1") 
  7.  required: org.apache.spark.sql.Column 
  8.        df.select(upper("key1")).collect 


上面在select中对字段key1调用了upper函数转换大小写,注意"key1"前面有个$符号,这个是scala最喜欢搞的语法糖,了解下写代码 会很方便。而下面没有加$符号在key1前面时就报错了,提示需要的是Column,而当前给的则是个String类型。


这时候的select也可以用selectExtr方法替换。比如下面的调用:

 

  1. scala> df.selectExpr("upper(key1)", "key2 as haha2").show 
  2. +-----------+-----+ 
  3. |upper(key1)|haha2| 
  4. +-----------+-----+ 
  5. |        AAA|    1| 
  6. |        BBB|    3| 
  7. |        CCC|    3| 
  8. |        BBB|    4| 
  9. +-----------+-----+ 


key1字段调用了变大写的函数,而key2字段改了别名haha2, ok, 一切顺利!


嗯,先写到这吧,困了。。。回头再接着写~~

 

下一篇:Spark的Dataset操作(二)-过滤的filter和where

收藏 推荐 打印 | 阅读:
相关新闻       spark  dataset