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

在单个 spark 数据框中减去两个字符串列的最佳 PySpark 实践是啥?

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

如何在 pyspark 中对 spark 数据框中的多列求和?

如何在 pyspark 中对 spark 数据框中的多列求和?