pyspark 1.6.0写入镶木地板给出“路径存在”错误

时间:2016-12-09 15:38:20

标签: apache-spark pyspark

我从不同文件夹中的镶木地板文件中读取,例如今年2月(一个文件夹=一天)

indata = sqlContext.read.parquet('/data/myfolder/201602*')

做一些非常简单的分组和聚合

outdata = indata.groupby(...).agg()

并希望再次存储。

outdata.write.parquet(outloc)

以下是我如何从bash运行脚本:

spark-submit 
  --master yarn-cluster 
  --num-executors 16 
  --executor-cores 4 
  --driver-memory 8g
  --executor-memory 16g 
  --files /etc/hive/conf/hive-site.xml  
  --driver-java-options 
  -XX:MaxPermSize=512m 
  spark_script.py

这会产生多个工作(这是正确的术语吗?)。第一份工作成功运行。后续作业失败,并显示以下错误:

  Traceback (most recent call last):
  File "spark_generate_maps.py", line 184, in <module>
    outdata.write.parquet(outloc)
  File "/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 471, in parquet
  File "/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__
  File "/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 51, in deco
pyspark.sql.utils.AnalysisException: u'path OBFUSCATED_PATH_THAT_I_CLEANED_BEFORE_SUBMIT already exists.;'

当我只提供一个文件夹作为输入时,这样可以正常工作。

所以似乎第一个作业创建了该文件夹,所有后续作业都无法写入该文件夹。为什么?

以防万一这可以帮助任何人:

进口:

from pyspark import SparkContext, SparkConf, SQLContext
from pyspark.sql import HiveContext
from pyspark.sql.types import *
from pyspark.sql.functions import udf, collect_list, countDistinct, count
import pyspark.sql.functions as func
from pyspark.sql.functions import lit
import numpy as np
import sys
import math

配置:

conf = SparkConf().setAppName('spark-compute-maps').setMaster('yarn-cluster')
sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)

2 个答案:

答案 0 :(得分:1)

您的问题是“为什么Spark会对输入文件夹进行迭代,但会应用默认的write模式,这在该上下文中没有意义”。

引用Spark V1.6 Python API ...

  

mode(saveMode)
   指定数据或表已存在时的行为    选项包括:
   追加将此DataFrame的内容追加到现有数据中    覆盖覆盖现有数据    错误如果数据已存在,则抛出异常     ignore 如果数据已存在,请静默忽略此操作。

我认为outdata.write.mode('append').parquet(outloc)值得一试。

答案 1 :(得分:0)

您应该在代码中添加模式选项。

outdata.write.mode('append').parquet(outloc)