使用PySpark读取XML

时间:2018-12-05 19:56:28

标签: python xml apache-spark databricks

我正在尝试使用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

0 个答案:

没有答案