Spark和groupby操作的XML源代码

时间:2016-08-04 23:18:24

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

我正在使用来自XML的{​​{1}}来源。这是我的databricks示例数据。

XML

我希望将<ds Name="abc"> <node begin="18" end="22" val="Organic" type="type1"> <hs id="0" begin="18" end="91" /> </node> <node begin="22" end="23" val="Cereal"> <hs id="0" begin="18" end="91" /> </node> <node begin="23" end="25" val="Kellogs" type="type2"> <hs id="0" begin="18" end="91" /> </node> <node begin="22" end="23" val="Harry" type="type1"> <hs id="1" begin="108" end="520" /> </node> <node begin="23" end="25" val="Potter" type="type1"> <hs id="1" begin="108" end="520" /> </node> </ds> 分组的所有node.valXML文件中显示的顺序相同)组合在一起。

例如,上述数据的o / p应为:

  

姓名hs id Val

     

abc 0有机谷物

     

abc 1哈利波特

以下是我从databricks加载XML源代码的地方:

hs id

我不确定如何按val df = sqlContext.read .format("com.databricks.spark.xml") .option("rowTag", "ds") .option("attributePrefix", "") .load(args(0)) df.registerTempTable("ds") 对数据集进行分组,并确保订单保留。

hs id

1 个答案:

答案 0 :(得分:1)

尝试:

import scala.collection.mutable.LinkedHashMap
import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.udf

val comb = udf((rows: Seq[Row]) => {
  val result = LinkedHashMap[Long, Array[String]]()
  for (row <- rows) {
     val id = row.getAs[Row]("hs").getAs[Long]("id")
     result(id) = result.getOrElse(id, Array[String]()) :+ row.getAs[String]("val")
  }
  result.values.toArray.map(x => x.mkString(" "))
})

df.printSchema
root
 |-- Name: string (nullable = true)
 |-- node: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- begin: long (nullable = true)
 |    |    |-- end: long (nullable = true)
 |    |    |-- hs: struct (nullable = true)
 |    |    |    |-- #VALUE: string (nullable = true)
 |    |    |    |-- begin: long (nullable = true)
 |    |    |    |-- end: long (nullable = true)
 |    |    |    |-- id: long (nullable = true)
 |    |    |-- type: string (nullable = true)
 |    |    |-- val: string (nullable = true)

df.withColumn("comb", comb(df("node")))