我从不同文件夹中的镶木地板文件中读取,例如今年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)
答案 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)