【问题标题】:How to select a subset of fields from an array column in Spark?如何从 Spark 中的数组列中选择字段子集?
【发布时间】:2016-07-28 08:17:14
【问题描述】:

假设我有一个如下的 DataFrame:

case class SubClass(id:String, size:Int,useless:String)
case class MotherClass(subClasss: Array[SubClass])
val df = sqlContext.createDataFrame(List(
      MotherClass(Array(
        SubClass("1",1,"thisIsUseless"),
        SubClass("2",2,"thisIsUseless"),
        SubClass("3",3,"thisIsUseless")
      )),
      MotherClass(Array(
        SubClass("4",4,"thisIsUseless"),
        SubClass("5",5,"thisIsUseless")
      ))
    ))

架构是:

root
 |-- subClasss: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- id: string (nullable = true)
 |    |    |-- size: integer (nullable = false)
 |    |    |-- useless: string (nullable = true)

我正在寻找一种仅选择字段子集的方法:数组列subClasssidsize,但保留嵌套数组结构。 生成的架构将是:

root
     |-- subClasss: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- id: string (nullable = true)
     |    |    |-- size: integer (nullable = false)

我已经尝试过

df.select("subClasss.id","subClasss.size")

但这会将数组subClasss 拆分为两个数组:

root
 |-- id: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- size: array (nullable = true)
 |    |-- element: integer (containsNull = true)

有没有办法保留原始结构并消除useless 字段?看起来像的东西:

df.select("subClasss.[id,size]")

感谢您的宝贵时间。

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    火花 >= 2.4

    arrays_zip 可以与cast 一起使用:

    import org.apache.spark.sql.functions.arrays_zip
    
    df.select(arrays_zip(
      $"subClasss.id", $"subClasss.size"
    ).cast("array<struct<id:string,size:int>>"))
    

    其中cast 需要rename nested fields - 如果没有它,Spark 将使用自动生成的名称01、...n

    火花:

    您可以像这样使用 UDF:

    import org.apache.spark.sql.Row
    
    case class Record(id: String, size: Int)
    
    val dropUseless = udf((xs: Seq[Row]) =>  xs.map{
      case Row(id: String, size: Int, _) => Record(id, size)
    })
    
    df.select(dropUseless($"subClasss"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多