如何将 Parquet 文件转换为数据集大于 RAM 内存的 ORC 文件?

问题描述

我打算用 ORC 文件格式做一些测试,但我无法从其他文件创建 ORC 文件

我在 Parquet(还有 HDF5 和 CSV)文件中有一个顺序/列式数据存储,我可以使用 Spark 和 Pandas 轻松操作。

我在本地工作,使用只有 8GB RAM 的 MAC-OS。该表有 80000 列和 7000 行。每一列代表一个测量源,行是所有时间的测量。

我正在使用 Pycharm,并且已经尝试使用 Spark 读/写数据帧和 Sparksql/Hive、本地和 HDFS 进行转换。

代码

spark = SparkSession \
    .builder \
    .master("local[*]") \
    .appName("ConvertPqtoOrc") \
    .config('spark.sql.debug.maxToStringFields',100000) \
    .config('spark.network.timeout',10000000) \
    .config('spark.executor.heartbeatInterval',10000000) \
    .config('spark.storage.blockManagerSlaveTimeoutMs',10000000) \
    .config('spark.executor.memory','6g') \
    .config('spark.executor.cores','4') \
    .config('spark.driver.memory','6g') \
    .config('spark.cores.max','300') \
    .config('spark.sql.orc.enabled','true') \
    .config('spark.sql.hive.convertmetastoreOrc','true') \
    .config('spark.sql.orc.filterPushdown','true') \
    .enableHiveSupport() \
    .getorCreate()

sc = spark.sparkContext

Spark 读/写尝试:

df_spark = spark.read.parquet(pq_path)
df_spark.write.mode("overwrite").format("orc").save(ORC_path)

Spark sql/Hive 尝试:

spark.sql("DROP TABLE if exists tbl_pq")
spark.sql("DROP TABLE if exists tbl_orc")

spark.sql("CREATE TABLE IF NOT EXISTS tbl_pq USING PARQUET LOCATION '{}'".format(db_path + Pq_file))

spark.sql("CREATE TABLE IF NOT EXISTS tbl_orc ({0} double) STORED AS ORC LOCATION '{1}'".format(" double,".join(map(str,myColumns)),db_path + Output_file))

spark.sql("INSERT OVERWRITE TABLE tbl_orc SELECT * FROM tbl_porque")

这两种方法都适用于过滤后的数据集(最多 20k 列/7000 行),当我使用整个表时,很长一段时间后,它在两种情况下都显示以下警告/错误

WARN DAGScheduler: broadcasting large task binary with size 7.3 MiB
ERROR Utils: Aborting task
java.lang.OutOfMemoryError: Java heap space

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)