【问题标题】:How to output a Spark ArrayType column to .csv for Postgres如何将 Spark ArrayType 列输出到 Postgres 的 .csv
【发布时间】:2019-09-23 20:02:27
【问题描述】:

我正在尝试将 spark 数据帧导入 Aurora RDS Postgres。

假设 DF 有 2 列,如下所示: |身份证号|我的Arr >|

我当前的管道包括将数据帧作为 .csv 写入 S3,然后通过 COPY 将该 .csv 插入 Aurora RDS Postgres。

我遇到的问题是我的数据框包含一个 ArrayType(字符串)列。

问题:

  • 是否有更好的方法可以完全跳过 S3?或使用类似 .parquet 格式的中介的方法? (postgres 似乎不支持批量插入 parquet 文件的简单方法,这就是我采用当前方法的方式)
  • 假设上面的答案是否定的,我知道我可以利用collect_ws() 来连接数组,但输出格式如下:"A,B,C" 当我需要它时看起来像这样"{A,B,C}"(其中是 Postgres 理解的 csv 数组格式)。我可以使用 UDF,但我仅限于在 PySpark 中工作,所以我真的更愿意避免使用 UDF,因为这个文件实际上相当大。

【问题讨论】:

  • 你仅限于极光吗?您可以写信到parquetjson 以保留架构(因为csv 不支持array 类型),然后使用athena rds 查询存储在s3 中的文件
  • 是的,不幸的是,我仅限于 Aurora。相关的是,我收集的那些数组可能相当大(最多 100k 个元素),并且将它们写入 S3(作为 csv 或 parquet)占用了 spark 应用程序总运行时间的 80%。
  • 你的数据都是字符串字节,所以这是有道理的
  • 我是 spark 新手,为什么字符串数据特别糟糕,性能方面并不明显。有方便的链接或快速解释吗?
  • 这不是spark 的事情;基础是javajvm ...不同的数据类型等同于不同的字节大小...spark 实际上试图通过tungsten 编码器项目来改进这一点

标签: postgresql apache-spark pyspark amazon-emr amazon-aurora


【解决方案1】:

啊,很好 - 回答我自己问题的第 2 部分。如果有人回复第 1 部分,将进行编辑。

我可以在调用collect_ws()后使用regexp_replace()插入'{''}'

类似这样的:

        myDF \
        .withColumn('MyArr', regexp_replace('MyArr', '\A', '{')) \
        .withColumn('MyArr', regexp_replace('MyArr', '\Z', '}'))

编辑:经过测试,这种方法并不适用,因为它会大大减慢运行时间(数组可能很大,大约有数万个 GUID)。

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多