【问题标题】:How to save a spark dataframe as a text file without Rows in pyspark?如何在pyspark中将spark数据框保存为没有行的文本文件?
【发布时间】:2015-12-04 08:28:17
【问题描述】:

我有一个数据框“df”,其中包含 ['name', 'age'] 列 我使用df.rdd.saveAsTextFile("..") 保存了数据框以将其保存为rdd。我加载了保存的文件,然后 collect() 给了我以下结果。

a = sc.textFile("\mee\sample")
a.collect()
Output:
    [u"Row(name=u'Alice', age=1)",
     u"Row(name=u'Alice', age=2)",
     u"Row(name=u'Joe', age=3)"]

这不是行的 rdd。

a.map(lambda g:g.age).collect()
AttributeError: 'unicode' object has no attribute 'age'

有没有办法将数据框保存为没有列名和行关键字的普通 rdd? 我想保存数据框,以便在加载文件和收集时应该给我如下:

a.collect()   
[(Alice,1),(Alice,2),(Joe,3)]

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    这是一个普通的RDD[Row]。问题是当你saveAsTextFile 并加载textFile 时,你得到的是一堆字符串。如果你想保存对象,你应该使用某种形式的序列化。例如pickleFile:

    from pyspark.sql import Row
    
    df = sqlContext.createDataFrame(
       [('Alice', 1), ('Alice', 2), ('Joe', 3)],
       ("name", "age")
    )
    
    df.rdd.map(tuple).saveAsPickleFile("foo")
    sc.pickleFile("foo").collect()
    
    ## [('Joe', 3), ('Alice', 1), ('Alice', 2)]
    

    【讨论】:

    • 是的,但是您如何将该泡菜文件加载回 spark df ?
    • @bluerubez OP 不希望 DataFrame 回来。如果你想序列化 DataFrame,有更好的格式,虽然元组也可以工作。
    【解决方案2】:

    我认为你可以这样做:

    a.map(lambda x:(x[0],x[1])).collect()
    

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2021-12-06
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多