使用 CLIXML 的 Spark 数据框

Posted

技术标签:

【中文标题】使用 CLIXML 的 Spark 数据框【英文标题】:Spark Dataframe with CLIXML 【发布时间】:2022-01-18 10:53:28 【问题描述】:

    我正在使用 databricks 读取 API 从 ADLSGEN2 读取 csv 文件。

    csv 文件仅包含一列,其中包含 Power Shell(clixml) 内容。

    在尝试使用 spark-xml 函数提取时,我没有得到 正确的架构和记录已损坏。

    所以请帮我将clixml转换为xml或exact 提取xml内容的解决方案。

代码块:

import com.databricks.spark.xml._
import com.databricks.spark.xml.from_xml_string
import com.databricks.spark.xml.functions.from_xml
import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.StructType
import spark.implicits._

var path = "csvpath"
val df= spark.read
.option("header","false")
.option("inferschema","true")
.csv(path)
val dfrename= df.withColumnRenamed("_c0","xmldata")
val xmlSchema = schema_of_xml(dfrename.select("xmldata").as[String])
val xmlDF = dfrename.withColumn("xmldata", from_xml(col("xmldata"), xmlSchema))
display(xmlDF )

XML 内容:示例

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <DT>2018-03-21T08:05:39.5085956-04:00</DT>
    <MS>
      <Obj N="DisplayHint" RefId="1">
        <TN RefId="0">
          <T>Microsoft.PowerShell.Commands.DisplayHintType</T>
          <T>System.Enum</T>
          <T>System.ValueType</T>
          <T>System.Object</T>
        </TN>
        <ToString>DateTime</ToString>
        <I32>2</I32>
      </Obj>
    </MS>
  </Obj>
</Objs>

【问题讨论】:

【参考方案1】:

在 Spark 中读取 XML

在解析 xml 之前,您不需要使用 csv 格式读取数据。可以使用xml 格式读取输入,并为rowTag 选项提供适当的值。查看您提供的数据,Obj 似乎是要为其创建行的相关标签。

Spark Shell 中的使用示例

使用包com.databricks:spark-xml_2.12:0.14.0 loaded 的Spark 3.1.2。

scala> val xmlDataFrame = spark.read.option("rowTag", "Obj").format("xml").load(path)                                                                                                                      
xmlDataFrame: org.apache.spark.sql.DataFrame = [DT: timestamp, MS: struct<Obj: struct<I32: bigint, TN: struct<T: array<string>, _RefId: bigint> ... 3 more fields>> ... 1 more field]                      
                                                                                                                                                                                                           
scala> xmlDataFrame.printSchema                                                                                                                                                                            
root                                                                                                                                                                                                       
 |-- DT: timestamp (nullable = true)                                                                                                                                                                       
 |-- MS: struct (nullable = true)                                                                                                                                                                          
 |    |-- Obj: struct (nullable = true)                                                                                                                                                                    
 |    |    |-- I32: long (nullable = true)                                                                                                                                                                 
 |    |    |-- TN: struct (nullable = true)                                                                                                                                                                
 |    |    |    |-- T: array (nullable = true)                                                                                                                                                             
 |    |    |    |    |-- element: string (containsNull = true)                                                                                                                                             
 |    |    |    |-- _RefId: long (nullable = true)                                                                                                                                                         
 |    |    |-- ToString: string (nullable = true)                                                                                                                                                          
 |    |    |-- _N: string (nullable = true)                                                                                                                                                                
 |    |    |-- _RefId: long (nullable = true)                                                                                                                                                              
 |-- _RefId: long (nullable = true)                                                                                                                                                                        
                                                                                                                                                                                                           
                                                                                                                                                                                                           
scala> xmlDataFrame.show(false)                                                                                                                                                                            
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------+------+                                    
|DT                        |MS                                                                                                                                 |_RefId|                                    
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------+------+                                    
|2018-03-21 12:05:39.508595|2, [Microsoft.PowerShell.Commands.DisplayHintType, System.Enum, System.ValueType, System.Object], 0, DateTime, DisplayHint, 1|0     |                                    
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------+------+  

                              
                                                                                                                                                                                                       

【讨论】:

以上是关于使用 CLIXML 的 Spark 数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用数据框架构的 Spark 地图数据框

使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]

Spark - 多次使用数据框而无需多次卸载

如何在数据块中使用 Spark sql 连接 Spark 数据框列

使用 spark scala 向空数据框添加一行

在 spark 数据框中使用 where 子句加载数据