我正在使用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()显示已添加新列。 我只想在此列中添加一个预定字符串作为值。
答案 0 :(得分:-2)
您的数据框csvdata将有一个名为 file_uploaded 的新列,其所有df行中的默认值为“ test”。该错误表明它正在尝试访问名为 test 的列,该列在数据框计费报告中不存在,因此该错误。在使用billingreports.dtypes查询列之前,请打印模式,或者更好地尝试使用billingreports.show()获取数据框的样本,并查看该列是否具有正确的名称和值。
如果您共享导致此异常的查询,那会更好,因为该异常是针对数据框计费报告引发的。