[英]How to convert a XML with different attribute schemas into a dataframe in scala
我有以下 XML 文件,每个表都有不同的属性名称,并且每个 at_name 的架构都不同。 这是一个很长的文件,我只在这里发布了几行:
<CATALOG>
<TABLE at_name="Furniture">
<ROWDATA>
<ROW typeid="0" caseid="0" key="1" code="0"/>
<ROW typeid="1" caseid="0" key="1" code="0"/>
<ROW typeid="1" caseid="1" key="1" code="0"/>
</ROWDATA>
</TABLE>
<TABLE at_name="Cutlery">
<ROWDATA>
<ROW cutleryTypeid="0" color="Blue" code="0"/>
<ROW cutleryTypeid="0" color="Blue" code="0"/>
</ROWDATA>
</TABLE>
<TABLE at_name="Apparel">
<ROWDATA>
<ROW ApparelTypeid="1" color="Blue" barcode="0111"/>
<ROW ApparelTypeid="0" color="Blue" barcode"1122"/>
</ROWDATA>
</TABLE>
<CATALOG>
为了读取 XML,我在 Scala 中为每个属性定义了自定义模式,这是用于家具的:
//Function to read XML furniture
def getFurniture: StructType = {
val rowType = new StructType()
.add("_typeid", StringType)
.add("_caseid", StringType)
.add("_key", StringType)
.add("_code", StringType)
val rowDataType = new StructType()
.add("ROW", ArrayType(rowType))
val furniType = new StructType()
.add("_at_name", StringType)
.add("ROWDATA", rowDataType)
furniType
}
//In the main class
val cabinetDF = session.read
.option("rootTag", "CATALOG")
.option("rowTag", "TABLE")
.schema(schema)
.xml(filePath)
.filter("_at_name = 'Furniture'")
当我运行这段代码时,我得到了这个数据框:
+---------+--------------------------------------------+
|_at_name |ROWDATA |
+---------+--------------------------------------------+
|Furniture|{[{0, 0, 1, 0}, {1, 0, 1, 0}, {1, 1, 1, 0}]}|
+---------+--------------------------------------------+
我想要的输出是:
我尝试使用explode来转换上面的数据框,但它不起作用,因为我使用了struct type,它提供了一些额外的括号。 有没有其他方法可以获得所需的输出?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.