【问题标题】:Failing to overwrite parquet hive table in pyspark无法覆盖 pyspark 中的镶木地板蜂巢表
【发布时间】:2016-08-22 09:09:18
【问题描述】:

使用:spark 1.5.2,hive 1.2 我有一个镶木地板格式的外部蜂巢表。我创建了一个 .py 脚本,它从 my_table 中选择一个数据框,进行一些转换,然后尝试写回原始表。

我尝试了以下方法:

  1. df.write.insertInto('table_name', overwrite='true')

这会引发以下错误:

pyspark.sql.utils.AnalysisException:无法将覆盖插入到正在读取的表中。

  1. df.write.mode('overwrite').parquet('my_path')
  2. df.write.parquet('my_path', mode='overwrite')
  3. df.write.save('my_path', format='parquet', mode = 'overwrite')

这些似乎都抛出了这个错误:

ERROR Client fs/client/fileclient/cc/client.cc:1802 Thread: 620 Open failed for file /my_path/part-r-00084-9, LookupFid error No such file or directory(2) 2016-04-26 16:47:17,0942 错误 JniCommon fs/client/fileclient/cc/jni_MapRClient.cc:2488 线程:620 getBlockInfo 失败,无法打开文件 /my_path/part-r-00084-9 16/04/26 16:47:17 WARN DAGScheduler:创建新阶段因异常而失败 - 作业:16

**请注意,如果文件格式为 orc,则上面的方法 1 可以正常工作,但会引发 parquet 错误。

任何建议将不胜感激!

【问题讨论】:

    标签: hive pyspark parquet


    【解决方案1】:

    从到目前为止我发现的所有内容来看,读取和写入 parquet 格式文件的解决方案似乎是写入临时/暂存目录,删除原始目录,然后将临时目录重命名为原始目录. 要在 pyspark 中执行此操作,您将需要以下命令:

    import os
    import shutil
    shutil.rmtree('my_tmp_path')
    os.rename('my_tmp_path', 'my_path)
    

    【讨论】:

      【解决方案2】:

      为此,您需要使用临时路径来写入。

      问题在于 Spark 正在主动使用实际路径来读取数据,当您尝试写入同一个 parquet 文件时,它会产生错误。

      Stella 已经给出了一个hint 应该做什么,但是顺序不对。所以我决定给你一个更好更完整的答案,因为我必须自己解决:

      在下面的代码中,我正在尝试使用临时文件保存数据框:

      def write_dataframe(df, table_name):
         # caches dataframe
         df.cache()
      
         dirout_tmp = PATH + table_name + "_tmp/"
         dirout = PATH + table_name + "/"
         # writing parquet file to a temporary location
         df.write.parquet(dirout_tmp, mode='overwrite')
         # removing original parquet
         shutil.rmtree(dirout, ignore_errors=True)
         # renaming the temp to the original path
         os.rename(dirout_tmp, dirout)
      

      【讨论】:

        猜你喜欢
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        相关资源
        最近更新 更多