使用 DataFrame 进行混合内容 XML 分析

Mixed Content XML parsing using DataFrame

提问人:Eric Thomas 提问时间:1/2/2018 最后编辑:Eric Thomas 更新时间:2/16/2021 访问量:282

问:

我有一个包含混合内容的 XML 文档,我正在使用 Dataframe 中的自定义架构来解析它。我遇到了一个问题,即架构只会获取“度量”的文本。

XML 如下所示

<QData>
    <Measure> some text here
        <Answer>Answer1</Answer>
        <Question>Question1</Question>
    </Measure>
    <Measure> some text here
        <Answer>Answer1</Answer>
        <Question>Question1</Question>
    </Meaure>
</QData>

我的架构如下:

def getCustomSchema():StructType = {StructField("QData",
      StructType(Array(
        StructField("Measure",
          StructType( Array( 
            StructField("Answer",StringType,true),
            StructField("Question",StringType,true)                
        )),true)
      )),true)}

当我尝试访问 Measure 中的数据时,我只得到“这里有一些文本”,当我尝试从 Answer 获取信息时,它失败了。我也只是得到一个措施。

编辑:这就是我尝试访问数据的方式

val result = sc.read.format("com.databricks.spark.xml").option("attributePrefix", "attr_").schema(getCustomSchema)
    .load(filename.toString)

val qDfTemp = result.mapPartitions(partition =>{val mapper = new QDMapper();partition.map(row=>{mapper(row)}).flatMap(list=>list)}).toDF()

case class QDMapper(){
    def apply(row: Row):List[QData]={
        val qDList = new ListBuffer[QData]()
        val qualData = row.getAs[Row]("QData") //When I print as list I get the first Measure text and that is it
        val measure = qualData.getAs[Row]("Measure") //This fails
}
}
scala apache-spark 数据帧 xml 解析

评论

0赞 rohitkulky 1/2/2018
你的 spark.read 命令是什么?
0赞 Eric Thomas 1/2/2018
我正在使用 val Qdata = row.getAs[Row](“QData”) 作为数据。我尝试了 val measure = Qdata.getAs[Row](“Measure”),但它失败了
0赞 Pratyush Sharma 1/2/2018
可以尝试使用 Databrick 的库将 xml 文档作为数据帧读取。val df = sqlContext.read.format(“com.databricks.spark.xml”).option(“rowTag”, “Measure”).load(“test.xml”)
0赞 Eric Thomas 1/2/2018
这就是我正在使用的,但我为它创建了一个自定义架构。在.load(“test.xml”)之前,我有.schema(getCustomSchema)。
7赞 Eric Thomas 1/8/2018
亲爱的未来人。我还没有找到解决这个确切问题的方法。我们刚刚添加了一个进程,将“some text here”括在它自己的 XML 标记中,数据块解析器按预期工作。

答:

0赞 Harshal Taware 2/16/2021 #1

您可以使用行标签作为根标签并访问其他元素:-

df_schema = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='<xml_tag_name>').load(schema_path)

请访问 https://github.com/harshaltaware/Pyspark/blob/main/Spark-data-parsing/xmlparsing.py 获取简要代码