Я пытаюсь читать XML с помощью PySpark, но у меня есть некоторые проблемы.
Я использую этот код:
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)))
В результате получается только последний 'Op' в каждом 'Cli', но я ожидал получить все 'Op' внутри каждого 'Cli' в списке, например:
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 '.
Я использую эту документацию .