PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)
Posted
技术标签:
【中文标题】PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)【英文标题】:PySpark: Read multiple XML files (list of s3 paths) in Spark dataframe 【发布时间】:2020-08-07 09:50:39 【问题描述】:正如问题所暗示的,我在列表中有一个 s3 路径列表
s3_paths = ["s3a://somebucket/1/file1.xml", "s3a://somebucket/3/file2.xml"]
我正在使用 PySpark,想了解如何将所有这些 XML 文件一起加载到数据框中?类似于下面显示的示例。
df = spark.read.format("com.databricks.spark.xml").option("rowTag", "head").load(s3_paths)
我能够读取单个文件,但想找到加载所有文件的最佳方式。
【问题讨论】:
如何启动pyspark
执行spark.read.format
代码?
将所有文件路径连接成一个逗号分隔的字符串:df = spark.read....load(','.join(s3_paths))
【参考方案1】:
@jxc 在 cmets 中对问题的回答是最好的解决方案:
df = spark.read.format("com.databricks.spark.xml")\
.option("rowTag", "head")\
.load(','.join(s3_paths))
这是一个使用玩具数据集的示例:
fnames = ['books_part1.xml','books_part2.xml'] # part1 -> ids bk101-bk106, part2 -> ids bk107-bk112
df = spark.read.format('xml') \
.option('rowTag','book')\
.load(','.join(fnames))
df.show()
# +-----+--------------------+--------------------+---------------+-----+------------+--------------------+
# | _id| author| description| genre|price|publish_date| title|
# +-----+--------------------+--------------------+---------------+-----+------------+--------------------+
# |bk101|Gambardella, Matthew|An in-depth look ...| Computer|44.95| 2000-10-01|XML Developer's G...|
# |bk102| Ralls, Kim|A former architec...| Fantasy| 5.95| 2000-12-16| Midnight Rain|
# |bk103| Corets, Eva|After the collaps...| Fantasy| 5.95| 2000-11-17| Maeve Ascendant|
# |bk104| Corets, Eva|In post-apocalyps...| Fantasy| 5.95| 2001-03-10| Oberon's Legacy|
# |bk105| Corets, Eva|The two daughters...| Fantasy| 5.95| 2001-09-10| The Sundered Grail|
# |bk106| Randall, Cynthia|When Carla meets ...| Romance| 4.95| 2000-09-02| Lover Birds|
# |bk107| Thurman, Paula|A deep sea diver ...| Romance| 4.95| 2000-11-02| Splish Splash|
# |bk108| Knorr, Stefan|An anthology of h...| Horror| 4.95| 2000-12-06| Creepy Crawlies|
# |bk109| Kress, Peter|After an inadvert...|Science Fiction| 6.95| 2000-11-02| Paradox Lost|
# |bk110| O'Brien, Tim|Microsoft's .NET ...| Computer|36.95| 2000-12-09|Microsoft .NET: T...|
# |bk111| O'Brien, Tim|The Microsoft MSX...| Computer|36.95| 2000-12-01|MSXML3: A Compreh...|
# |bk112| Galos, Mike|Microsoft Visual ...| Computer|49.95| 2001-04-16|Visual Studio 7: ...|
# +-----+--------------------+--------------------+---------------+-----+------------+--------------------+
【讨论】:
【参考方案2】:您可以查看以下 GitHub 存储库。
https://github.com/databricks/spark-xml【讨论】:
【参考方案3】:解压清单
s3_paths = ["s3a://somebucket/1/file1.xml", "s3a://somebucket/3/file2.xml"]
df = spark.read.format("com.databricks.spark.xml").option("rowTag", "head").load(*s3_paths)
【讨论】:
试过了 - 它不起作用。异常:java.lang.ClassNotFoundException:找不到数据源:s3a://somebucket/3/file2.xml。以上是关于PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件
在单个 spark 数据框中减去两个字符串列的最佳 PySpark 实践是啥?
如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列