无法在Spark中配置ORC属性
我正在使用Spark 1.6(Cloudera 5.8.2)并尝试以下方法来配置ORC属性。 但它不会影响输出。
下面是我试过的代码片段。
DataFrame dataframe = hiveContext.createDataFrame(rowData, schema); dataframe.write().format("orc").options(new HashMap(){ { put("orc.compress","SNAPPY"); put("hive.exec.orc.default.compress","SNAPPY"); put("orc.compress.size","524288"); put("hive.exec.orc.default.buffer.size","524288"); put("hive.exec.orc.compression.strategy", "COMPRESSION"); } }).save("spark_orc_output");
除此之外,我还尝试了在hive-site.xml和hiveContext对象中设置的这些属性。
输出上的hive –orcfiledump确认未应用配置。 Orcfiledump片段如下。
Compression: ZLIB Compression size: 262144
你在这里犯了两个不同的错误。 我不怪你; 我去过那儿…
问题#1
orc.compress
和其余的不是Spark DataFrameWriter
选项。 它们是Hive配置属性,必须在创建hiveContext
对象之前定义…
- 在发布时可用于Spark的
hive-site.xml
- 或者在您的代码中,通过重新创建
SparkContext
…
sc.getConf.get("orc.compress","
sc.stop
val scAlt = new org.apache.spark.SparkContext((new org.apache.spark.SparkConf).set("orc.compress","snappy"))
scAlt.getConf.get("orc.compress","
val hiveContextAlt = new org.apache.spark.sql.SQLContext(scAlt)
[编辑]使用Spark 2.x脚本将成为……
spark.sparkContext.getConf.get("orc.compress","
spark.close
val sparkAlt = org.apache.spark.sql.SparkSession.builder().config("orc.compress","snappy").getOrCreate()
sparkAlt.sparkContext.getConf.get("orc.compress","
问题#2
Spark将自己的SerDe库用于ORC(以及Parquet,JSON,CSV等),因此它不必遵循标准的Hadoop / Hive属性。
Parquet有一些特定于Spark的属性,它们都有很好的文档记录 。 但同样,必须在创建(或重新创建) hiveContext
之前设置这些属性。
对于ORC和其他格式,您必须使用特定于格式的DataFrameWriter
选项; 引用最新的JavaDoc ……
您可以设置以下ORC特定选项来编写ORC文件:
•compression
(默认snappy
):保存到文件时使用的压缩编解码器。 这可以是已知的不区分大小写的缩写名称之一(none
,snappy
,zlib
和lzo
)。 这将覆盖orc.compress
请注意,默认压缩编解码器已随Spark 2更改; 在此之前它是zlib
因此,您唯一可以设置的是压缩编解码器,使用
dataframe.write().format("orc").option("compression","snappy").save("wtf")
- 如何在spark中映射JavaPairRDD的键?
- 为什么Apache Spark在客户端上执行filter
- 多节点hadoop集群中的Apache Spark Sql问题
- 使用Mongo-Hadoop连接器通过Apache Spark更新MongoDb中的集合
- Spark与Cassandra输入/输出
- 如何使用Java中的Structured Streaming从Kafka反序列化记录?
- 缓存()/ persist()的apache-spark内存消耗
- 使用mapPartition和迭代器保存spark RDD
- 在Apache Spark中,我可以轻松地重复/嵌套SparkContext.parallelize吗?