如何将一个500GB的SQL表格转换成Apache Parquet格式?

14

也许这已经有很好的文档记录了,但我非常困惑如何做到这一点(有许多Apache工具)。

当我创建一个SQL表时,我使用以下命令来创建表:

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

如何将这个现有的表格转换为Parquet格式?该文件已写入磁盘?如果原始数据有几GB,需要等待多长时间?

我能否将原始数据格式化为Parquet格式?


4
值得注意的是,现在Spark正在成为“Hadoop和其他领域的通用ETL引擎”,因此Sqoop没有真正的未来。(Sqoop最初由Cloudera作为临时解决方案开发,但现在Cloudera正在支持Spark...) - Samson Scharfrichter
3个回答

17

Apache Spark 可用于完成此操作:

1.load your table from mysql via jdbc
2.save it as a parquet file

示例:

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.read.jdbc("YOUR_MYSQL_JDBC_CONN_STRING",  "YOUR_TABLE",properties={"user": "YOUR_USER", "password": "YOUR_PASSWORD"})
df.write.parquet("YOUR_HDFS_FILE")

太好了!感谢这个。 - ShanZhengYang
我们如何检查此保存的进度?这个命令在我的机器上卡了半个小时了?数据库的大小为44 GB。 - Viv
@Viv 你可以查看Spark作业网页获取详细的任务信息,通常它在localhost:8080上运行。 - liprais
1
我的个人经验告诉我,要使用这个解决方案,你需要注意以下两点:1. 你的 MySQL 数据库实例可以处理的并行查询数量。2. 你在 Spark 中使用的 JDBC 驱动程序 应该能够使用高 fetchSize(如10k)。 - y2k-shubham
连接正常,但尝试从mysql中提取整个表时,出现了以下错误:java.sql.SQLException: GC overhead limit exceeded。你们有人遇到过同样的问题吗? - kennyut
当我在我的Mac上执行此操作时,我遇到了以下错误,请告知任何建议:java.sql.SQLException: No suitable driver。 - Gadzair

4

在某些情况下,odbc2parquet 命令行工具可能也会很有帮助。

odbc2parquet \
-vvv \ # Log output, good to know it is still doing something during large downloads
query \ # Subcommand for accessing data and storing it
--connection-string ${ODBC_CONNECTION_STRING} \
--batch-size 100000 \ # Batch size in rows
--batches-per-file 100 \ # Ommit to store entire query in a single file
out.par \ # Path to output parquet file
"SELECT * FROM YourTable"

0
另一个节省内存的选项是使用SQLAlchemy的流式查询结果,并逐步使用PyArrow将它们附加到parquet文件中。 在SQLAlchemy中设置Connection.execution_options.stream_results = True,然后使用Result.yield_per()以块的形式获取行。 对于每次迭代,将获取的行放入pyarrow.Table中,并使用pyarrow.parquet.ParquetWriter.write_table将其附加到文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接