【问题标题】:Scala DataFrame: Explode an arrayScala DataFrame:分解数组
【发布时间】:2015-09-17 08:20:36
【问题描述】:

我在 Scala 中使用 spark 库。我使用

创建了一个 DataFrame
val searchArr = Array(
  StructField("log",IntegerType,true),
  StructField("user", StructType(Array(
    StructField("date",StringType,true),
    StructField("ua",StringType,true),
    StructField("ui",LongType,true))),true),
  StructField("what",StructType(Array(
    StructField("q1",ArrayType(IntegerType, true),true),
    StructField("q2",ArrayType(IntegerType, true),true),
    StructField("sid",StringType,true),
    StructField("url",StringType,true))),true),
  StructField("where",StructType(Array(
    StructField("o1",IntegerType,true),
    StructField("o2",IntegerType,true))),true)
)

val searchSt = new StructType(searchArr)    

val searchData = sqlContext.jsonFile(searchPath, searchSt)

我现在是什么爆炸字段what.q1,它应该包含一个整数数组,但是文档是有限的: http://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrame.html#explode(java.lang.String,%20java.lang.String,%20scala.Function1,%20scala.reflect.api.TypeTags.TypeTag)

到目前为止,我尝试了几件事,但运气不佳

val searchSplit = searchData.explode("q1", "rb")(q1 => q1.getList[Int](0).toArray())

关于如何在数组上使用爆炸的任何想法/示例?

【问题讨论】:

  • 您正在查看的文档是 1.4.0。那是你使用的 spark 版本吗?

标签: scala dataframe explode apache-spark-sql


【解决方案1】:

您是否尝试在字段 “what” 上使用 UDF?类似的东西可能很有用:

val explode = udf {
(aStr: GenericRowWithSchema) => 
  aStr match {
      case null => ""
      case _  =>  aStr.getList(0).get(0).toString()
  }
}


val newDF = df.withColumn("newColumn", explode(col("what")))

在哪里:

  • getList(0) 返回“q1”字段
  • get(0) 返回“q1”的第一个元素

我不确定,但您可以尝试使用 getAs[T](fieldName: String) 而不是 getList(index: Int)

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 2019-12-09
    • 2015-12-15
    • 1970-01-01
    • 2018-11-08
    • 2014-05-27
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多