代码之家  ›  专栏  ›  技术社区  ›  Naim

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

  •  1
  • Naim  · 技术社区  · 6 年前

    我正在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|
    +------+-------+--------+
    

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

    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在这种情况下会期望使用基串类型,以及我可以如何处理数据以使其符合要求。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Shaido Aman    6 年前

    查看数据框 documentation csv文件可以使用从DBFS加载到Spark中 sqlContext 。既然如此,您可以以类似的方式保存数据(可以获得一些关于保存RDD的信息 here )。换句话说,没有必要使用 dbutils 要保存,请执行以下操作:

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

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