【发布时间】:2021-04-20 00:25:09
【问题描述】:
在python中,字节字符串可以简单地保存到单个xml文件中:
with open('/home/user/file.xml' ,'wb') as f:
f.write(b'<Value>1</Value>')
当前输出:/home/user/file.xml(保存在本地文件中的文件)
问题:如何在pyspark中将字符串保存到hdfs上的xml文件:
预期输出:'hdfs://hostname:9000/file.xml'
背景:大量 xml 文件由 3rd 方 Web API 提供。我在 pyspark 中构建到 delta 湖的 ETL 管道。数据由aiohttp异步提取,接下来我想在将spark数据帧保存到delta湖之前使用spark-xml进行转换(需要pyspark)。我正在寻找最有效的方式来构建管道。
在 github 上向 spark-xml 开发人员提出了类似的问题。 https://github.com/databricks/spark-xml/issues/515
最新研究:
-
spark-xml 用作输入 xml 文件直接存储为磁盘上的文本或 spark 数据帧
-
所以我只能使用以下 2 个选项之一:
a) 一些 hdfs 客户端(pyarrow,hdfs,aiohdfs) 将文件保存到 hdfs (hdfs 上的文本文件不是很有效的格式)
b) 将数据加载到 spark-xml 转换的 spark 数据帧(delta Lake 的本机格式)
如果您有其他想法,请告诉我。
【问题讨论】:
-
这些似乎是无关的问题。您在阅读文件时遇到什么问题?
-
我已将示例修改为最小代码。我的问题是我不知道如何将字节串直接保存到单个 hdfs 文件中。我从 web api 将 xml 文件下载到 python 中的字节字符串。我可以将 file.xml 保存到 python 中的本地文件系统。我找不到如何使用 pyspark 将字符串 b'
1 ' 直接保存到 hdfs 的方法,所以目前我先将文件保存到本地文件系统,然后将其从本地 fs 复制到 hdfs这是浪费资源。 -
你不需要 Spark。您可以使用 WebHDFS 或其他 Python 库来编写文件。 stackoverflow.com/questions/47926758/python-write-to-hdfs-file 不过,你还是需要某种方式的本地文件...
-
感谢您的快速回答,我将测试建议的库,我有大型 ETL,我正在将文件从不同格式的不同 api 下载到 pyspark 中的 databricks delta 湖,我正在尝试保留尽可能少的库,所以当所有代码都在 pyspark 中时,我尝试直接在 pyspark 中对其进行编码。我使用 asyncio 进行下载,所以我也在尝试 aiohdfs。