我正在尝试使用PySpark读取XML,但是我遇到了一些问题。
我正在运行以下代码:
df_cli = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='Cli').load('MyFile.txt', schema = schema_xml)
和MyFile.txt:
<Cli Tp="1" Cd="8338" Autorzc="S">
<Op Contrt="1" NatuOp="01" Mod="1304">
<Venc v110=" 123" v120=" 123"/>
</Op>
<Op Contrt="2" NatuOp="01" Mod="1304">
<Venc v110=" 123" v120=" 123"/>
</Op>
</Cli>
<Cli Tp="2" Cd="8568" Autorzc="N">
<Op Contrt="3" NatuOp="01" Mod="1304">
<Venc v110=" 123" v120=" 123"/>
</Op>
<Op Contrt="4" NatuOp="01" Mod="1304">
<Venc v110=" 123" v120=" 123"/>
</Op>
</Cli>
模式:
schema_xml = StructType([
StructField("@Autorzc", StringType(), True),
StructField("@Cd", StringType(), True),
StructField("@Tp", StringType(), True),
StructField("Op",
StructType([
StructField("@Contrt", StringType(), True),
StructField("@Mod", StringType(), True),
StructField("@NatuOp", StringType(), True),
StructField("Venc",
StructType([
StructField("@v110", StringType(), True),
StructField("@v120", StringType(), True)
])
)
])
)
])
运行此代码时,我的输出是:
Row(@Autorzc=u'S', @Cd=u'8338', @Tp=u'1', Op=Row(@Contrt=u'2', @Mod=u'1304', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123)))
Row(@Autorzc=u'N', @Cd=u'8568', @Tp=u'2', Op=Row(@Contrt=u'4', @Mod=u'0202', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123)))
结果是每个“ Cli”中仅获得最后一个“ Op”,但我希望将列表中每个“ Cli”中的所有“ Op”都获得,如下所示:
Row(@Autorzc=u'S', @Cd=u'8338', @Tp=u'1', Op=[Row(@Contrt=u'1', @Mod=u'1304', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123)), Row(@Contrt=u'2', @Mod=u'1304', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123))])
Row(@Autorzc=u'N', @Cd=u'8568', @Tp=u'2', Op=[Row(@Contrt=u'3', @Mod=u'1304', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123)), Row(@Contrt=u'4', @Mod=u'1304', @NatuOp=u'01', Venc=Row(@v110=u' 123', @v120=u' 123))])
Obs:在我的原始文件中,我可以有1、2、3 ... N个“ Op”,而每个“ Op”只有1个“ Venc”。
我正在使用this documentation。