apache-spark - Apache Spark 数据框 createJDBCTable 异常

标签 apache-spark apache-spark-sql apache-spark-1.5

save to JDBC相关,尝试导入文本文件并保存到 Hive JDBC 文件以供报告工具导入。

我们正在运行 spark-1.5.1-bin-hadoop2.6(master + 1 slave)、JDBC thrift 服务器和 beeline 客户端。他们似乎都相互联系和交流。据我所知,Hive 包含在此版本中的 datanucleus jar 中。我已配置目录来保存 Hive 文件,但没有 conf/hive-config.xml。

简单的输入 CSV 文件:

Administrator,FiveHundredAddresses1,92121
Ann,FiveHundredAddresses2,92109
Bobby,FiveHundredAddresses3,92101
Charles,FiveHundredAddresses4,92111

用户表已经在beeline客户端使用预先创建

 CREATE TABLE users(first_name STRING, last_name STRING, zip_code STRING);
 show tables;    // it's there

对于 master 上的 scala REPL session :

 val connectionUrl = "jdbc:hive2://x.y.z.t:10000/users?user=blah&password="
 val userCsvFile = sc.textFile("/home/blah/Downloads/Users4.csv")
 case class User(first_name:String, last_name:String, work_zip:String)
 val users = userCsvFile.map(_.split(",")).map(l => User(l(0), l(1), l(2)))
 val usersDf = sqlContext.createDataFrame(users)
 usersDf.count()  // 4
 usersDf.schema  // res92: org.apache.spark.sql.types.StructType = StructType(StructField(first_name,StringType,true), StructField(last_name,StringType,true), StructField(work_zip,StringType,true))
 usersDf.insertIntoJDBC(connectionUrl,"users",true)

 usersDf.createJDBCTable(connectionUrl, "users", true)  // w/o beeline creation

val properties = new java.util.Properties
properties.setProperty("user", "blah")
properties.setProperty("password", "blah")
val connectionUrl = "jdbc:hive2://172.16.3.10:10000"
contactsDf.write.jdbc(connectionUrl,"contacts", properties)

抛出

warning: there were 1 deprecation warning(s); re-run with -deprecation for details
java.sql.SQLException: org.apache.spark.sql.AnalysisException: cannot recognize input near 'TEXT' ',' 'last_name' in column type; line 1 pos  
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:296)
at org.apache.hive.jdbc.HiveStatement.executeUpdate(HiveStatement.java:406)
at org.apache.hive.jdbc.HivePreparedStatement.executeUpdate(HivePreparedStatement.java:119)
at org.apache.spark.sql.DataFrameWriter.jdbc(DataFrameWriter.scala:275)
at org.apache.spark.sql.DataFrame.insertIntoJDBC(DataFrame.scala:1629)

有什么地方出错了吗?这个版本真的可以从 DataFrame 写入 JDBC 文件吗?

感谢您的帮助!

乔恩

最佳答案

经过大量搜索(现在可以使用),您可以在 REPL 中执行此操作:

import org.apache.spark.sql.SaveMode
contactsDf.saveAsTable("contacts", SaveMode.Overwrite)

我还配置了 $SPARK_INSTALL_LOC/conf/hive-site.xml 如下:

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>org.apache.derby.jdbc.EmbeddedDriver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>

<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive-warehouse</value>
  <description>Where to store metastore data</description>
</property>

</configuration>

另一个关键是,由于 Derby 的线程限制,将 Derby 作为 Hive 后备数据库,您不能(至少我是如何配置它的)同时运行 ThriftJdbc 服务器和 REPL。但是,如果用 Postgres 或 MySQL 等重新配置它,也许可以同时访问。

关于apache-spark - Apache Spark 数据框 createJDBCTable 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33791536/

相关文章:

java - newAPIHadoopRDD 任务不可序列化

apache-spark - PySpark:ModuleNotFoundError:没有名为 'app' 的模块

hadoop - Spark 的 oozie 等价物是什么?

apache-spark - 将转换后的 DataFrame 保存/导出回 JDBC/MySQL

scala - sbt-assembly:合并错误 - 重复数据删除

apache-spark - Kafka spark directStream 无法获取数据

apache-spark - 齐柏林飞艇 [0.7.2] : NullPointerException on executing paragraph from a new Notebook

scala - Spark SQL中如何按列降序排序?

mongodb - 从多个 MongoDB 中读取以形成数据集

apache-spark-sql - 查找一个数据帧在另一个数据帧中所有出现的值的最佳方法是什么?