联接后下载完整结果时出现错误

问题

你正在处理笔记本中的两个表。 执行了联接。 可以预览输出,但尝试下载完整结果时遇到错误。

Error in SQL statement: AnalysisException: Found duplicate column(s) when inserting into dbfs:/databricks-results/

重现错误

  1. 创建两个表。

    from pyspark.sql.functions import *
    
    df = spark.range(12000)
    df = df.withColumn("col2",lit("test"))
    df.createOrReplaceTempView("table1")
    
    df1 = spark.range(5)
    df1.createOrReplaceTempView("table2")
    
  2. 对表执行左外部联接。

    select * from table1 t1 left join table2 t2 on t1.id = t2.id
    
  3. 单击“下载预览”。 随后会下载 CSV 文件。

  4. 单击“下载完整结果”。 随后会生成错误。

原因

  • 可以正常执行“下载预览”的原因是该操作只在前端上的浏览器中运行。 系统不会检查任何约束,并且 CSV 文件中只包含 1000 行。
  • “下载完整结果”操作会重新执行 Apache Spark 中的查询,并在内部写入 CSV 文件。 联接操作后,如果找到重复的列,则就会发生该错误。

解决方案

选项 1

如果选择了全部所需的列并可以避免在执行联接操作后出现重复的列,则不会遇到该错误,而是可以下载完整结果。

select t1.id, t1.col2 from table1 t1 left join table2 t2 on t1.id = t2.id

方法 2

可以使用数据帧来防止出现重复的列。 如果执行联接操作后未出现重复的列,则不会遇到该错误,而是可以下载完整结果。

result_df = df.join(df1, ["id"],"left")
display(result_df)