【问题标题】:Is there a way to directly insert data from a parquet file into PostgreSQL database?有没有办法将 parquet 文件中的数据直接插入 PostgreSQL 数据库?
【发布时间】:2019-11-10 08:05:37
【问题描述】:

我正在尝试恢复一些以 parquet 格式保存的历史备份文件,我想从中读取一次并将数据写入 PostgreSQL 数据库。

我知道备份文件是使用 spark 保存的,但是对我有一个严格的限制,即我不能在数据库机器中安装 spark 或在远程设备中使用 spark 读取 parquet 文件并使用 spark_df.write.jdbc 将其写入数据库.一切都需要在数据库机器上进行,并且在没有 spark 和 Hadoop 的情况下,只需要使用 Postgres 和 Bash 脚本。

我的文件结构类似于:

foo/
    foo/part-00000-2a4e207f-4c09-48a6-96c7-de0071f966ab.c000.snappy.parquet
    foo/part-00001-2a4e207f-4c09-48a6-96c7-de0071f966ab.c000.snappy.parquet
    foo/part-00002-2a4e207f-4c09-48a6-96c7-de0071f966ab.c000.snappy.parquet
    ..
    ..

我希望从每个 parquet 文件夹(如 foo)中读取数据和架构,使用该架构创建一个表并将数据写入成形表,仅使用 bash 和 Postgres CLI。

【问题讨论】:

  • 你可以试试 Parquet Foreign Data Wrapper github.com/adjust/parquet_fdw。您必须先从 HDFS 下载文件。
  • @RemusRusanu 这很有趣,谢谢!我将对其进行测试,但提交表明它仍在大量开发中。我正在寻找基于使用 bash 处理文件的解决方案。

标签: bash postgresql hdfs parquet


【解决方案1】:

您可以使用 spark 并将 parquet 文件转换为 csv 格式,然后将文件移动到 DB 机器并通过任何工具导入。

spark.read.parquet("...").write.csv("...")
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces

from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')

df.to_sql("my_table_name", engine)

【讨论】:

  • 感谢您的回答!最终,我决定在另一台机器上使用 spark 将 parquet 文件转换为 CSV,将 CSV 文件发送到 DB 机器并使用 SQL COPY foo FROM '/path/to/csv/foo' WITH (FORMAT CSV) 语句传播表。
  • 这是我对“使用 python 将 csv 文件摄取到 Postgres 的最简单方法”这个问题所见过的最佳答案之一
  • 或者,您甚至可以跳过整个读取到 Spark/写入 CSV 的步骤,只需使用 pyarrow.parquet 并使用 ParquetDataset 函数直接读取到 pandas - 这可以节省整个写入和读取的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多