为什么 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
.
我在 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
.