【问题标题】:Spark SQL create an array with array values in a columnSpark SQL在列中创建具有数组值的数组
【发布时间】:2018-11-11 15:03:05
【问题描述】:

我有一列整型数组:

 case class Testing(name: String, age: Int, salary: Double, array: Array[Int])

  val x = sc.parallelize(Array(
     Testing(null, 21, 905.33, Array(1,2,3)),
     Testing("Noelia", 26, 1130.60, Array(3,2,1)),
     Testing("Pilar", 52,  1890.85, Array(3,3,3)),
     Testing("Roberto", 31, 1450.14, Array(1,0,0))
   ))

  // Convert RDD to a DataFrame 
  val df = sqlContext.createDataFrame(x) 

  // For SQL usage we need to register the table
   df.registerTempTable("df")

我想创建一个数组,其元素是“数组”列的值。如何在 Spark SQL 中做到这一点?

 sqlContext.sql("SELECT [array] from df").show

 [ [1,2,3], [3,2,1], [3,3,3], [1,0,0]]

【问题讨论】:

  • 我认为您缺少代码。假设你真的在谈论 Spark SQL,你需要一个创建 DataFrame 的步骤。
  • 这样理解更好?

标签: scala apache-spark user-defined-functions apache-spark-sql


【解决方案1】:

假设您暗示您有一个名为 dfDataFrame,并且 Array() 值位于名为 array 的列中,这应该可以解决问题。

df.select($"array").rdd.map{
  row =>  row.getList[Int](0).toArray
}.collect()

如果你想通过sqlContext.sql来做的话:

sqlContext.sql("SELECT array FROM df").rdd.map{
  row =>  row.getList[Int](0).toArray
}.collect()

【讨论】:

  • 有什么方法可以通过函数 udf 做到这一点?
  • 如果是这样,它将在udf 中执行完全相同的逻辑。您必须以一种或另一种方式将DataFrame 转换为Array[Array[Int]]。这意味着DataFrame -> RDD[Row] -> RDD[Array[Int]] -> Array[Array[Int]]
  • 对不起,我是新手,我不知道怎么做。假设我想要类似:sqlContext.sql("select agg(array1, array2, array3) from df")。因为我可以定义这样的函数?
  • 你可以做sqlContext.sql("SELECT array[0] as array1, array[1] as array2, array[2] as array3 FROM df")——这有帮助吗?
  • 不,我想在 UDF 函数中传递您使用代码创建的数组,就像我那样做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2017-11-19
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多