spark示例数据://spark-2.3.0-bin-hadoop2.7//examples//src//main//resources//people.json
数据内容:
{“name”:“Michael”}
{“name”:“Andy”, “age”:30}
{“name”:“Justin”, “age”:19}
创建dataframe:
val sparksession = SparkSession.builder().master(“local”).appName("spark sql demo ").getOrCreate()
val df = sparksession.read.json(“C://Users//tanhaidi//Downloads//spark-2.3.0-bin-hadoop2.7//examples//src//main//resources//people.json”)
import sparksession.implicits._
相信大家看书或者看网上例子的时候,都会遇到下面这个语句(dollar符号打出来会出问题,这里贴上图片):
结果:
±------±--------+
| name|(age + 1)|
±------±--------+
|Michael| null|
| Andy| 31|
| Justin| 20|
±------±--------+
那我看到这的时候就会想,age字符是个int类型,可以直接加1,那name字段是个字符串类型,可以直接拼接一个字符串吗?
尝试着写了一下:
结果:
±-----------±—+
|(name + abc)| age|
±-----------±—+
| null|null|
| null| 30|
| null| 19|
±-----------±—+
都是空???这个肯定不是我们想看到的结果,我们想要的是名字后面加上“abc”这样的。
通过查资料,发现select方法有两个重构方法,一个方法的参数都是String,另一个方法的参数都是Column,那么我写的代码,相当于一个Column类型的字段加了一个字符串(“abc”),这样一定会有问题的。
这里就想,怎么能把"abc"从字符串转换成一个Column类型的列呢?通过查资料发现真有这么一个函数lit()!!!
用这个函数,貌似可以解决这个问题,代码:
结果:±------±---------------+
| name|concat(name, ab)|
±------±---------------+
|Michael| Michaelab|
| Andy| Andyab|
| Justin| Justinab|
±------±---------------+
附上全部代码(好多都注释了,学习用)
package com.bj58.spark
import org.apache.