apache-spark - 无法在 pyspark 中导入 lzo 文件

标签 apache-spark pyspark lzo

我有一个以 lzo 格式压缩的 csv 文件,我想将其导入到 pyspark 数据框中。如果文件未压缩,我会简单地执行以下操作:

import pyspark as ps

spark = ps.sql.SparkSession.builder.master("local[2]").getOrCreate()
data = spark.read.csv(fp, schema=SCHEMA, sep="\t")

其中文件路径fp和模式SCHEMA在其他地方正确定义。然而,当使用 lzo 压缩文件时,这会返回一个充满 null 值的数据帧。

我已经在我的机器上安装了 lzop,并且可以从终端解压缩该文件,然后使用 pyspark 导入它。但是,由于硬盘空间和时间限制(我有大量的 lzo 文件),这不是一个可行的解决方案。

最佳答案

我花了很长时间,但我找到了解决方案。我的灵感来自this answer并尝试手动重现 Maven 使用 Java 所做的事情。

以下是要遵循的步骤:

  1. 查找 pyspark 主文件夹:在 Ubuntu 上执行此操作的一种方法是从终端运行命令 locate pyspark/find_spark_home.py;如果失败,请确保您安装了 pyspark 并运行命令 sudo Updatedb,然后再次尝试使用 locate。 (确保选择正确的 pyspark 安装:您可能有多个安装,尤其是在使用虚拟环境时。)
  2. this maven repository 下载 hadoop-lzo jar并将其放入 $pyspark_home/jars 文件夹中。
  3. 创建文件夹 $pyspark_home/conf
  4. 在此文件夹内,创建一个包含以下文本的 core-site.xml 文件:

    <configuration>
        <property>
            <name>io.compression.codecs</name>
            <value>
                org.apache.hadoop.io.compress.DefaultCodec,
                com.hadoop.compression.lzo.LzoCodec,
                com.hadoop.compression.lzo.LzopCodec,
                org.apache.hadoop.io.compress.GzipCodec,
                org.apache.hadoop.io.compress.BZip2Codec
            </value>
        </property>
        <property>
            <name>io.compression.codec.lzo.class</name>
            <value>com.hadoop.compression.lzo.LzoCodec</value>
        </property>
    </configuration>
    

现在问题中的代码应该可以正常工作。

关于apache-spark - 无法在 pyspark 中导入 lzo 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49696594/

相关文章:

java - 阅读 Apache Spark 中的多行 JSON 文件后,如何获取嵌套属性作为列?

python - 保存 Spark 模型摘要

python - pyspark 数据框到字典 : columns as keys and list of column values ad dict value

hadoop - Lzo 文件不会在配置单元作业中拆分

licensing - 获得 GPLv2 许可的库能否用于专有应用程序?

scala - DMLC 在 Spark-1.6.1 上的 XGBoost-4j

java - newAPIHadoopRDD 任务不可序列化

python - Pyspark directStreams foreachRdd 始终有空 RDD

python - 如何从pyspark中的特定目录加载模块

amazon-web-services - 当从 S3 读取时,为什么我的 LZO 索引在 Amazon EMR 上需要很长时间?