使用spark

时间:2015-10-29 18:56:28

标签: apache-spark apache-spark-sql vertica

How to load a parquet file into vertica database using spark???

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

我尝试使用上面的链接将数据框(镶木地板文件)加载到它工作的mysql中。但是当我试图将它加载到vertica数据库时,这就是我所面临的错误。下面的错误是因为vertica db不支持数据框(镶木地板文件)中的数据类型(String)。我不想输入列,因为它会成为性能问题。我们希望加载大约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

2 个答案:

答案 0 :(得分:1)

由于您在createJDBCTable上收到错误,因此您可以自行创建表格,然后使用insertIntoJDBC

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

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

答案 1 :(得分:0)

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

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