在火花结构化流上进行Xml解析

时间:2019-08-14 19:12:58

标签: apache-spark pyspark xml-parsing spark-structured-streaming

我正在尝试在Databricks上的PySpark结构化流中使用Kinesis源分析数据。

我创建了一个数据框,如下所示。

kinDF = spark.readStream.format("kinesis").("streamName", "test-stream-1").load()

稍后,我从base64编码转换了数据,如下所示。

df =  kinDF.withColumn("xml_data", expr("CAST(data as string)"))

现在,我需要使用xpath从df.xml_data列中提取一些字段。您能提出任何可能的解决方案吗?

如果我直接以xml_df = spark.read.format("xml").options(rowTag='Consumers').load("s3a://bkt/xmldata")的形式为这些xml文件创建一个数据框,则可以使用xpath进行查询:

xml_df.select("Analytics.Amount1").show()

但是,不确定在文本格式的数据的Spark Streaming数据帧上如何类似地提取元素。

是否有任何XML函数可以使用模式转换文本数据?我看到了一个使用from_json的json数据示例。

是否可以在数据框列上使用spark.read?

我需要为每5分钟窗口查找一个汇总的“ Amount1”。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用com.databricks.spark.xml.XmlReader从列中读取xml数据,但需要RDD,这意味着您需要使用dfRDD转换为df.rdd,这可能会影响性能。

以下是Spark Java中未经测试的代码:

import com.databricks.spark.xml

xmlRdd = df = kinDF.select("xml_data").map(r -> r[0])
new XmlReader().xmlRdd(spark, xmlRdd)
相关问题