Spark对复杂结构的处理
结构体
创建结构体
在字符串公式中就是一个”()“就表示一个结构体
//创建结构体
//方法1:
df.selectExpr("(Description, InvoiceNo) as complex", "*").show(2)
//方法2:
df.selectExpr("struct(Description, InvoiceNo) as complex", "*").show(2)
查询结构体中的信息使用'.'
数组
我们的数组通常是DataFrame的一个元素。
- split函数
对数组元素的访问://对Description的数据进行切分生成数组 df.select(split(col("Description"), " ").as("array")).show(2)
//对Description的数据进行切分生成数组 val arrayDF = df.select(split(col("Description"), " ").as("array")) arrayDF.show(20) arrayDF.selectExpr("array[0]").show(20)
下面是一些常用的函数:
- size(Array[])-查询数组的长度
- array_contains(Array[], 单词)-查询是否包含
- explode(重要)
将Array或者Map中形成一列。具体效果看运行的代码结果://对Description的数据进行切分生成数组 val arrayDF = df.select(split(col("Description"), " ").as("array"), col("*")) arrayDF.show(2) arrayDF.withColumn("splittedArray", explode(col("array"))) .select("Description", "splittedArray").show(8)
map结构
创建map
//创建map
df.select(map(col("Description"), col("InvoiceNo")).as("map")).show(2)
可以使用key值对value进行查询,若key值不存在则返回null
key值查询
//创建map
val mapDF = df.select(map(col("Description"), col("InvoiceNo")).as("map"))
mapDF.selectExpr("map['WHITE METAL LANTERN']").show(2)
将map的键值对转换成列
//创建map
val mapDF = df.select(map(col("Description"), col("InvoiceNo")).as("map"))
//方法1:
mapDF.selectExpr("explode(map)").show(2)
//方法2:
mapDF.select(explode(col("map"))).show(2)