如何根据 Scala 中不同的 XML 属性名称传递自定义模式
How to pass through a custom schema depending on different XML attribute names in Scala
我需要为下面的 XML 定义自定义架构。每个 TABLE 属性都有不同的列,因此我想为每个属性定义不同的自定义架构。
<CASE>
<TABLE attrname="Wood">
<ROWDATA>
<ROW Weight="55" Length="11" color="Black"/>
</ROWDATA>
</TABLE>
<TABLE attrname="Metal">
<ROWDATA>
<ROW Type ="AL" Weight="66" Length="23" Unit="0" />
<ROW Type ="AL" Weight="44" Length="22" Unit="0"/>
<ROW Type ="AL" Weight="33" Length="21" Unit="1"/>
</ROWDATA>
<TABLE attrname="Plastic">
<ROWDATA>
<ROW color="Blue" Grade="A" Price="112"/>
</ROWDATA>
</TABLE>
<CASE>
这可以用来读取XML,但是有没有办法在检查属性名称后读取它?例如,如果 table 属性名称是“Plastic”,那么我想使用以下架构来读取 XML.
val xmlDFF = session.read
.option("rootTag", "CASE")
.option("rowTag", "TABLE")
.schema(getPlasticSchema)
.xml(filePath)
def getPlasticSchema: StructType = {
val rowType = new StructType()
.add("_color", StringType)
.add("_Grade", StringType)
.add("_Price", StringType)
val rowDataType = new StructType()
.add("ROW", ArrayType(rowType))
val tableTypePlastic = new StructType()
.add("_attrname", StringType)
.add("ROWDATA", rowDataType)
tableTypePlastic
}
It 看起来不像 可以在阅读时进行过滤。但是你可以在:
之后做
.xml(filePath)
.filter("_attrname = 'Plastic'")
我需要为下面的 XML 定义自定义架构。每个 TABLE 属性都有不同的列,因此我想为每个属性定义不同的自定义架构。
<CASE>
<TABLE attrname="Wood">
<ROWDATA>
<ROW Weight="55" Length="11" color="Black"/>
</ROWDATA>
</TABLE>
<TABLE attrname="Metal">
<ROWDATA>
<ROW Type ="AL" Weight="66" Length="23" Unit="0" />
<ROW Type ="AL" Weight="44" Length="22" Unit="0"/>
<ROW Type ="AL" Weight="33" Length="21" Unit="1"/>
</ROWDATA>
<TABLE attrname="Plastic">
<ROWDATA>
<ROW color="Blue" Grade="A" Price="112"/>
</ROWDATA>
</TABLE>
<CASE>
这可以用来读取XML,但是有没有办法在检查属性名称后读取它?例如,如果 table 属性名称是“Plastic”,那么我想使用以下架构来读取 XML.
val xmlDFF = session.read
.option("rootTag", "CASE")
.option("rowTag", "TABLE")
.schema(getPlasticSchema)
.xml(filePath)
def getPlasticSchema: StructType = {
val rowType = new StructType()
.add("_color", StringType)
.add("_Grade", StringType)
.add("_Price", StringType)
val rowDataType = new StructType()
.add("ROW", ArrayType(rowType))
val tableTypePlastic = new StructType()
.add("_attrname", StringType)
.add("ROWDATA", rowDataType)
tableTypePlastic
}
It 看起来不像 可以在阅读时进行过滤。但是你可以在:
之后做.xml(filePath)
.filter("_attrname = 'Plastic'")