Spark的Dataset操作(一)-列的选择select
来源:互联网 发布:广州java 外包公司 编辑:程序博客网 时间:2024/05/20 04:47
环境说明:
用的版本是Spark 2.1,Dataset操作很丰富,join的支持也蛮好的,比原来用的spark 1.4好用多了。
嗯,Dataset操作,我觉得最重要的是把Column类的用法弄清楚。毕竟,后面的Dataset操作都是在操作列。最好的资料自然是官方文档,Spark的API文档还是挺详细的,而且还细分了Java/Scala/Python。
来个例子边看边说:
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])
上面的代码创建了一个DataFrame,有三列,列名分别是key1, key2, key3, 类型对应string, integer, integer。
当前造了4条记录,如上所示。
接下来看看选择列的几种调用方式:
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方法中参数直接用字符串只能用DataFrame中的命名字段名。不能对字段名再使用像SQL的select语法的表达式。但是$"key1"这种写法对应的是select方法的Column参数类型重载,可以支持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中对字段key1调用了upper函数转换大小写,注意"key1"前面有个$符号,这个是scala最喜欢搞的语法糖,了解下写代码会很方便。而下面没有加$符号在key1前面时就报错了,提示需要的是Column,而当前给的则是个String类型。
这时候的select也可以用selectExtr方法替换。比如下面的调用:
scala> df.selectExpr("upper(key1)", "key2 as haha2").show+-----------+-----+|upper(key1)|haha2|+-----------+-----+| AAA| 1|| BBB| 3|| CCC| 3|| BBB| 4|+-----------+-----+
key1字段调用了变大写的函数,而key2字段改了别名haha2, ok, 一切顺利!
嗯,先写到这吧,困了。。。回头再接着写~~
阅读全文
0 0
- Spark的Dataset操作(一)-列的选择select
- select选择的操作
- Spark的Dataset操作(四)-其他单表操作
- Spark的Dataset操作(五)-多表操作 join
- 操作edittype为select的列,获取/操作select
- Spark的Dataset操作(二)-过滤的filter和where
- Spark的Dataset操作(三)-分组,聚合,排序
- DataReader和DataSet的选择
- SqlDataRead和Dataset的选择
- Spark RDD、DataFrame和DataSet的区别
- Spark RDD、DataFrame和DataSet的区别
- Spark的RDD与DataFrame、DataSet
- Spark RDD、DataFrame和DataSet的区别
- Spark RDD、DataFrame和DataSet的区别
- Spark RDD、DataFrame和DataSet的区别
- Spark RDD、DataFrame和DataSet的区别
- spark-SQL的DataFrame和DataSet
- Spark RDD、DataFrame和DataSet的区别
- Collection集合中存放自定义对象
- Python UnitTest 文档中文翻译-5-6(渣翻自娱)
- CI框架中使用URI类segment方法获取url中的中文参数的问题
- 拉宾米勒测试
- 单片机MCU学习方法总结
- Spark的Dataset操作(一)-列的选择select
- python requests 库使用小结(二)
- c++阉割版binder实现
- Android多点触摸
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- hihoCoder1318—非法二进制数(数位dp)
- JAVA第一课第七节知识点
- 2017年/7月/9日随手记_表单跳转后地址栏多了问号
- GreenPlum之进程会话管理篇