使用pyspark

时间:2018-10-01 09:45:38

标签: pyspark apache-spark-sql pyspark-sql

我想将二进制格式的镶木地板文件转换为csv文件。我在spark中使用以下命令。

sqlContext.setConf("spark.sql.parquet.binaryAsString","true")

val source =  sqlContext.read.parquet("path to parquet file")

source.coalesce(1).write.format("com.databricks.spark.csv").option("header","true").save("path to csv")

当我在HDFS服务器中启动spark并运行这些命令时,此方法有效。当我尝试将相同的实木复合地板文件复制到本地系统并启动pyspark并运行这些命令时,它给出了错误。

我能够将binary as string属性设置为true,并能够读取本地pyspark中的实木复合地板文件。但是,当我执行命令以写入csv时,会出现以下错误。

  

2018-10-01 14:45:11 WARN ZlibFactory:51-无法加载/初始化   native-zlib库2018-10-01 14:45:12错误Utils:91-正在终止任务   java.lang.UnsupportedOperationException:不支持的编码:   DELTA_BYTE_ARRAY           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.initDataReader(VectorizedColumnReader.java:577)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readPageV2(VectorizedColumnReader.java:627)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.access $ 100(VectorizedColumnReader.java:47)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader $ 1.visit(VectorizedColumnReader.java:550)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader $ 1.visit(VectorizedColumnReader.java:536)           在org.apache.parquet.column.page.DataPageV2.accept(DataPageV2.java:141)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readPage(VectorizedColumnReader.java:536)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readBatch(VectorizedColumnReader.java:164)           在org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:263)处           在org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:161)           在org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39)           在org.apache.spark.sql.execution.datasources.FileScanRDD $$ anon $ 1.hasNext(FileScanRDD.scala:109)           在org.apache.spark.sql.execution.datasources.FileScanRDD $$ anon $ 1.nextIterator(FileScanRDD.scala:186)           在org.apache.spark.sql.execution.datasources.FileScanRDD $$ anon $ 1.hasNext(FileScanRDD.scala:109)

与hdfs中的相同方法一样,应该怎么做才能解决此本地计算机中的错误?解决这个问题的任何想法都会有很大帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试禁用VectorizedReader。

spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false")

这不是解决方案,但这是一种解决方法。 禁用它的后果将是https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-vectorized-parquet-reader.html

答案 1 :(得分:0)

问题: 在Spark 2.x读取实木复合地板文件中出现异常的情况下,其中某些列是DELTA_BYTE_ARRAY编码的。

例外: java.lang.UnsupportedOperationException:不支持的编码:DELTA_BYTE_ARRAY

解决方案: 如果关闭矢量化阅读器属性,则读取这些文件会很好。

说明: 这些文件是用Parquet V2编写器编写的,因为增量字节数组编码是Parquet v2的功能。 Spark 2.x矢量化阅读器似乎不支持该格式。 Issue already created on apache’s jira。为了解决这个特殊的问题。

Fig 1.0 Snapshot of Issue.

使用此解决方案的缺点。 对于Hive,Drill和Presto这样的SQL引擎,矢量化查询执行可以大大提高性能。向量化查询执行可以一次处理一批行,从而简化了操作,而不是一次处理一行。但是spark 2.x不支持第二版镶木地板的此功能,因此我们需要依靠此解决方案,直到进一步发布为止。