Loading

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)
posted @ 2023-02-13 22:41  青山新雨  阅读(60)  评论(0编辑  收藏  举报