使用 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/scala 中的两个特定字段过滤数据框 [关闭]