【问题标题】:Parse complexe xml in spark在 Spark 中解析复杂的 xml
【发布时间】:2019-10-16 19:39:39
【问题描述】:

从数据块中的 TSV/CSV 文件中提取 Xml 数据

对于 Tsv 文件之间的 xml 数据,我几乎不需要任何帮助。在几个 Databricks 问题论坛上看到了答案。我不确定是否可以直接实现和使用任何 UDF 类型的函数。如果可以在 pyspark 中完成任何事情或任何内置的 databricks 实用程序可以处理它,请请求您的输入。

需要 tsv id、status 其他列以及 XML 中的一些内部属性。 请建议如何在 pyspark 或 spark sql 中实现逻辑。这里的文件不是 XML,文件中的一列有 XML 数据。

我尝试像文本一样读取文件并将其转换为 dataframe 。我需要建议从数据框中提取 XML 内容。

文件示例如下所示,顶部有标题:

Id || UserId || UserSgid || ClientId || Version || WTVersion || Details || Status || DCT || DMD || Visible   


33144   
6587a872-23ce-4453-8c68-1209ac21352b    
ce9c6fcc-d20e-4f5f-8e64-e307849d1fda    
986b5314-7269-4bd3-abee-6f9b1b27b990    
1    
1   

<Workflow xmlns="http://schemas.datacontract.org/2004/07/SMT.WorkflowSteps" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><DateCompleted i:nil="true" />

<DateStarted>2017-05-19T02:50:25.647</DateStarted>
<Enabled>true</Enabled>
<Id>986b5314-7269-4bd3-abee-6f9b1b27b990</Id>
<Status>Started</Status>
<Visible>true</Visible>
<DateCreated>2019-08-22T21:47:24.8648778Z</DateCreated>
<ExecutionId>c2ea7b9d-cd6a-432f-8fd4-2e8cfae679e9</ExecutionId>
<Steps xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:anyType i:type="WorkflowPhase">
        <DateCompleted i:nil="true" />
        <DateStarted i:nil="true" />
        <Enabled>true</Enabled>
        <Id>8184775f-a5f2-4648-bb6b-cbc840f73a10</Id>
        <Status>NotStarted</Status>
        <Visible>true</Visible>
<Steps>
<a:anyType i:type="OldAccommodationRequestWorkflowStep">
    <DateCompleted i:nil="true" />
    <DateStarted i:nil="true">

1   
2016-05-18 17:19:37.9770000 
2019-08-22 21:47:36.3600000 
True

需要从具有 xml 内容的详细信息列中提取数据以及 Id,UserId,UserSgid,ClientId,Version,WTVersion 和少量其他数据,如 ExecutionId ,Status 等。

【问题讨论】:

  • 能否请您明确您的文件样本?例如,我无法区分 Id 和 xml 部分。谢谢
  • 嗨 Driss,请找到如下示例文件,

标签: xml apache-spark pyspark azure-databricks


【解决方案1】:

您可以使用已弃用的xmlRdd(这是唯一的解决方案,我现在可以看到)。 假设您有以下 xml:

 public static void readFromString() {
    SparkConf sparkConf = new SparkConf().setAppName("Print Elements of RDD")
            .setMaster("local[2]").set("spark.executor.memory","2g");

    JavaSparkContext sc = new JavaSparkContext(sparkConf);

    String books = "<persons>\n" +
            "    <person id=\"1\">\n" +
            "        <firstname>James</firstname>\n" +
            "        <lastname>Smith</lastname>\n" +
            "        <middlename></middlename>\n" +
            "        <dob_year>1980</dob_year>\n" +
            "        <dob_month>1</dob_month>\n" +
            "        <gender>M</gender>\n" +
            "        <salary currency=\"Euro\">10000</salary>\n" +
            "    </person>\n" +
            "</persons>";

    List<String> booksList = Arrays.asList(books);

    RDD<String> booksRDD = sc.parallelize(booksList, 1).rdd();

    Dataset<Row> rowDataset = new XmlReader().withRowTag("person").xmlRdd(new SQLContext(sc), booksRDD);

    rowDataset.printSchema();

    rowDataset.select("person.*").show();

}

rowDataset.printSchema() 的结果:

root
 |-- person: struct (nullable = true)
 |    |-- _id: long (nullable = true)
 |    |-- dob_month: long (nullable = true)
 |    |-- dob_year: long (nullable = true)
 |    |-- firstname: string (nullable = true)
 |    |-- gender: string (nullable = true)
 |    |-- lastname: string (nullable = true)
 |    |-- middlename: string (nullable = true)
 |    |-- salary: struct (nullable = true)
 |    |    |-- _VALUE: long (nullable = true)
 |    |    |-- _currency: string (nullable = true)

rowDataset.select("person.*").show();的结果

+---+---------+--------+---------+------+--------+----------+------------+
|_id|dob_month|dob_year|firstname|gender|lastname|middlename|      salary|
+---+---------+--------+---------+------+--------+----------+------------+
|  1|        1|    1980|    James|     M|   Smith|          |[10000,Euro]|
+---+---------+--------+---------+------+--------+----------+------------+

您可以将相同的逻辑应用于您的用例

【讨论】:

  • 感谢 Nejjar,使用数据框 pyspark 查找任何内容。请建议 .. 看看这是否有助于不使用 RDD。
  • 您可以使用 rdd.toDF 将您的 RDD 转换为数据帧,其中 rdd 是您的基本 rdd。
  • 感谢 Nejjar,pyspark 或 sparksql 上的任何内容,如果您能提出建议,将会有很大帮助
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多