我已经提交了一个与saveAsTextFile有关的类似问题,但是我不确定一个问题是否会像我现在有一个新的错误消息一样提供相同的答案:
我已经编译了以下pyspark.sql代码:
#%%
import findspark
findspark.init('/home/packt/spark-2.1.0-bin-hadoop2.7')
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('ops').getOrCreate()
df = spark.read.csv('/home/packt/Downloads/Spark_DataFrames/Person_Person.csv',inferSchema=True,header=True)
df.createOrReplaceTempView('Person_Person')
myresults = spark.sql("""SELECT
PersonType
,COUNT(PersonType) AS `Person Count`
FROM Person_Person
GROUP BY PersonType""")
myresults.collect()
result = myresults.collect()
result
result.saveAsTextFile("test")
但是,出现以下错误:
Append ResultsClear Results
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-9e137ed161cc> in <module>()
----> 1 result.saveAsTextFile("test")
AttributeError: 'list' object has no attribute 'saveAsTextFile'
正如我提到的,我正在尝试使用命令saveAsTextFile将查询结果发送到文本文件,但是出现上述错误。
有人可以阐明如何解决此问题吗?
答案 0 :(得分:0)
Collect()返回数据框的所有记录作为Row类型的列表。并且您在列表的结果上调用“ SaveAsTextFile”。
列表不具有“ saveAsTextFile”功能,因此抛出错误。
result = myresults.collect()
result.saveAsTextFile("test")
要将数据框的内容保存到文件中,您有2个选项:
将DataFrame转换为RDD并在其上调用'saveAsTextFile'函数。
myresults.rdd.saveAsTextFile(OUTPUT_PATH)
使用DataframeWriter。在这种情况下,DataFrame必须仅具有字符串类型的一列。每行都将在输出文件中换行。
myresults.write.format("text").save(OUTPUT_PATH)
由于数据框中的列多于1,请继续执行选项1。
默认情况下,spark还将为随机播放创建200个分区。因此,将在输出路径中创建200个文件。如果数据较少,请根据数据大小配置以下参数。
spark.conf.set("spark.sql.shuffle.partitions", 5) # 5 files will be written to output folder.