为什么 Pyspark 在将数据框导出到 csv 或 txt 文件时需要类型 basestring?

Why is Pyspark expecting type basestring when exporting a dataframe to csv or txt file?

我在 Databricks 的社区版本中使用 Pyspark,使用 Python 2.7 和 Spark 2.2.1。我有一个 Pyspark 数据框 "top100m":

In: type(movie_ratings_top100m)
Out: pyspark.sql.dataframe.DataFrame

其中有 3 个数字类型的列:

In: top100m.printSchema()
Out: root
 |-- userId: long (nullable = true)
 |-- itemId: long (nullable = true)
 |-- userPref: double (nullable = true)

In: top100m.show(6)
Out: 
+------+-------+--------+
|userId| itemId|userPref|
+------+-------+--------+
|   243|     10|     3.5|
|   243|     34|     3.5|
|   243|     47|     4.0|
|   243|    110|     4.0|
|   243|    150|     2.5|
|   243|    153|     2.0|
+------+-------+--------+

数据框中没有字符串。当尝试使用以下代码行(基于找到的 Databricks 文档 here)将此文件输出为 csv 或 txt 文件时:

dbutils.fs.put("/FileStore/mylocation/top100m.csv", top100m)
dbutils.fs.put("/FileStore/mylocation/top100m.txt", top100m)

我收到以下错误:

TypeError: DataFrame[userId: bigint, itemId: bigint, userPref: double] has the wrong type - (<type 'basestring'>,) is expected.

我对 Python 2 中存在的 basestring 超类型有一个粗略的了解,它在 Python 3 中被放弃了,我认为这与这里无关,但我可以是错的。我的最终目标是能够将我的 Pyspark 数据框从 Databricks 导出到我的本地机器上。我的问题是为什么 Spark/Databricks 在这种情况下会期待 basestring 类型,以及我可以如何处理我的数据以使其符合要求。

在查看包括 forums 在内的 Databricks 文档后,似乎没有一种非常直接的方法可以将数据传输到我的本地计算机(我没有连接到 S3 存储桶)。最简单的似乎是我上面提到的方法,它给我错误。如果有更好的方法来实现这一点,那将非常有帮助。

查看数据块 documentation csv files can be loaded into Spark from DBFS using sqlContext. Since that is the case, you can save data in a similar way (some information regarding saving RDDs is available here)。换句话说,不需要使用 dbutils 来保存,而是:

top100m.write.format("csv").save("/FileStore/mylocation/top100m.csv")

由于 Spark 保存文件的方式 top100m.csv 将是一个目录。在里面,数据框的每个分区都有一个 csv 文件。这些称为 part-xxxxx(其中 xxxxx 是从 00000 开始的数字)。在保存之前,可以通过在数据帧上调用 coalesce(1) 来获取单个零件文件。在这种情况下,csv 文件将被称为 part-00000.