使用utf-16le编码读取pyspark中的xml文件

flvtvl50  于 2021-07-09  发布在  Spark
关注(0)|答案(0)|浏览(169)

我正在运行msazure云上的hdinsight spark cluster。spark版本是2.4.6,scala版本是2.11.12,python版本是2.7.12
我在azure数据湖存储器上有很多xml文件,它们是用utf-16le(如果我运行file-i命令)或ucs-2le-bom(如果我用notepad++)编码的
我想读取jupyter笔记本中的那些文件,以便能够解析xml并提供一些可视化效果,但是,我无法正确显示数据。以下是我迄今为止尝试的:

%%configure -f
{"conf":{"spark.jars.packages":"com.databricks:spark-xml_2.11:0.10.0"}}

data = spark.read.format("com.databricks.spark.xml").option("rootTag", "rootElement").option("rowTag", "rowElement").\
option("encoding", "utf-16LE").\
option("charset", "utf-16LE").\
load("abfs://blob@datalakestorage.dfs.core.windows.net/files/")

我尝试过utf-16le写入的各种变体(utf-16 le、utf-16le、utf-16le),但似乎没有任何效果,因为当我这样加载文件时,我要么得到空Dataframe:

data.show()

root
++
||
++
++

或者Dataframe只加载带有中文记录的\u损坏的\u记录(此特定文件中的文本为德语和英语):

root
 |-- _corrupt_record: string (nullable = true)

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|_corrupt_record                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|琼⁵牣慥楴湯慤整∽

我也试着把这些文件读作rdd:

file_rdd = spark.read.text("abfs://blob@datalakestorage.dfs.core.windows.net/files/", wholetext=True).rdd
data = file_rdd.collect()
data[0:15]

[Row(value='��<\x00?\x00x\x00m\x00l\x00 \x00v\           .......

我最后尝试的是:

data = sc.textFile("abfs://blob@datalakestorage.dfs.core.windows.net/files/", use_unicode=False).map(lambda x: x.decode("utf-16le"))
data.collect()[0:15]

我还收到一个错误,指出unicodedecodeerror:'utf16'编解码器无法解码位置0:截断数据中的字节0x00
如果我在notepad++中手动更改编码,数据将加载并可读,但目前,我无法重新编码数据湖上的所有文件。
谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题