使用 spark 将 parquet 文件加载到 vertica 数据库中

Posted

技术标签:

【中文标题】使用 spark 将 parquet 文件加载到 vertica 数据库中【英文标题】:loading parquet file into vertica database using spark 【发布时间】:2015-10-29 18:56:27 【问题描述】:
How to load a parquet file into vertica database using spark???

链接 (http://www.sparkexpert.com/2015/04/17/save-apache-spark-dataframe-to-database/)

我尝试使用上面的链接将数据框(镶木地板文件)加载到 mysql 中,它起作用了。但是当我尝试将它加载到 vertica 数据库中时,这是我面临的错误。下面的错误是因为 vertica db 不支持数据帧(镶木地板文件)中的数据类型(字符串)。我不想键入强制转换列,因为这将是一个性能问题。我们希望加载大约 2.8 亿行。您能否建议将数据加载到 vertica db 中的最佳方法。

Exception in thread “main” java.sql.SQLSyntaxErrorException: [Vertica][VJDBC](5108) ERROR: Type “TEXT” does not exist
at com.vertica.util.ServerErrorData.buildException(Unknown Source)
at com.vertica.io.ProtocolStream.readExpectedMessage(Unknown Source)
at com.vertica.dataengine.VDataEngine.prepareImpl(Unknown Source)
at com.vertica.dataengine.VDataEngine.prepare(Unknown Source)
at com.vertica.dataengine.VDataEngine.prepare(Unknown Source)
at com.vertica.jdbc.common.SPreparedStatement.(Unknown Source)
at com.vertica.jdbc.jdbc4.S4PreparedStatement.(Unknown Source)
at com.vertica.jdbc.VerticaJdbc4PreparedStatementImpl.(Unknown Source)
at com.vertica.jdbc.VJDBCObjectFactory.createPreparedStatement(Unknown Source)
at com.vertica.jdbc.common.SConnection.prepareStatement(Unknown Source)
at org.apache.spark.sql.DataFrameWriter.jdbc(DataFrameWriter.scala:275)
at org.apache.spark.sql.DataFrame.createJDBCTable(DataFrame.scala:1611)
at com.sparkread.SparkVertica.JdbctoVertica.main(JdbctoVertica.java:51)
Caused by: com.vertica.support.exceptions.SyntaxErrorException: [Vertica][VJDBC](5108) ERROR: Type “TEXT” does not exist
… 13 more

【问题讨论】:

【参考方案1】:

由于您在createJDBCTable 上遇到错误,您可以自己创建表并改用insertIntoJDBC

另一个想法是尝试将 spark.sql.dialect 设置为 Postgres,因为我在 spark 中注意到 registerDialect(PostgresDialect)。也就是说,除了使用jdbc:postgresql 之外,我不知道如何执行此操作,但如果您使用该驱动程序,您将无法获得Vertica 的JDBC 驱动程序为您提供的最佳插入的任何优势。您可能需要修改here 以允许它为jdbc:vertica 使用该方言。如果由于某种原因不起作用,您需要添加新的方言。

我个人认为第一个选项更简单。

【讨论】:

【参考方案2】:

当 Vertica 表与 dataFrame(以及相应的类型,VARCHAR)具有相同的列名时,以下对我有用(同时保留 vertica 的 jdbc):

myDataFrame.write().mode(SaveMode.Append).jdbc(url, "MY_VERTICA_TABLE", new Properties());

【讨论】:

以上是关于使用 spark 将 parquet 文件加载到 vertica 数据库中的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark 将 parquet 数据从 Google 云存储加载到 BigQuery

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

如何让 Spark 使用 Parquet 文件中的分区信息?

Spark 数据帧 CSV 与 Parquet

为啥 Apache Spark 会读取嵌套结构中不必要的 Parquet 列?

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]