pyspark sql with where子句引发列不存在错误

时间:2018-08-07 06:45:29

标签: apache-spark dataframe pyspark databricks

我正在使用pyspark将csv加载到redshift。我想查询如何添加许多行。 我使用withcolumn函数创建一个新列:

csvdata=df.withColumn("file_uploaded", lit("test"))

我看到此列已创建,可以使用psql查询。但是,当我尝试使用pyspark sql上下文进行查询时,出现错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o77.showString.
: java.sql.SQLException: [Amazon](500310) Invalid operation: column "test" does not exist in billingreports;

有趣的是,我能够查询其他列,而不仅仅是我添加的新列。

赞赏有关如何解决此问题的所有提示。

完整代码:

df=spark.read.option("header","true").csv('/mnt/spark/redshift/umcompress/' + 
filename)
csvdata=df.withColumn("fileuploaded", lit("test"))

countorig=csvdata.count()

## This executes without error
csvdata.write \
    .format("com.databricks.spark.redshift") \
    .option("url", jdbc_url) \
    .option("dbtable", dbname) \
    .option("tempformat", "CSV") \
    .option("tempdir", "s3://" + s3_bucket + "/temp") \
    .mode("append") \
    .option("aws_iam_role", iam_role).save()

select="select count(*) from " + dbname + " where fileuploaded='test'"

## Error occurs
df = spark.read \
.format("com.databricks.spark.redshift") \
.option("url", jdbc_url) \
.option("query", select) \
.option("tempdir", "s3://" + s3_bucket + "/test") \
.option("aws_iam_role", iam_role) \
.load()
newcounnt=df.count()

感谢您的回复。 数据框确实有一个名为file_uploaded的新列 这是查询: select =“从计费报告中选择count(*),其中file_uploaded ='test'”

我已经打印了模式

|-file_uploaded:字符串(nullable = true)

df.show()显示已添加新列。 我只想在此列中添加一个预定字符串作为值。

1 个答案:

答案 0 :(得分:-2)

您的数据框csvdata将有一个名为 file_uploaded 的新列,其所有df行中的默认值为“ test”。该错误表明它正在尝试访问名为 test 的列,该列在数据框计费报告中不存在,因此该错误。在使用billingreports.dtypes查询列之前,请打印模式,或者更好地尝试使用billingreports.show()获取数据框的样本,并查看该列是否具有正确的名称和值。

如果您共享导致此异常的查询,那会更好,因为该异常是针对数据框计费报告引发的。