Apache Spark dataframe createJDBCTable исключение
Связано с сохранением в JDBC, попыткой импортировать текстовый файл и сохранить в файл Hive JDBC для импорта с помощью инструментов отчетности.
Мы используем spark-1.5.1-bin-hadoop2.6 (ведущий + 1 ведомый), сервер управления JDBC и клиент beeline. Кажется, все они взаимосвязаны и общаются. Из того, что я могу понять, Hive включен в этот выпуск в datanucleus jars. Я настроил каталоги для хранения файлов 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
Для сессии scala REPL на мастере:
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)
Есть идеи, где я иду не так? Может ли эта версия записывать файлы JDBC из DataFrame?
Спасибо за любую помощь!
Джон
1 ответ
После долгих поисков (теперь это работает) вы можете сделать это в 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 в качестве резервной базы данных Hive вы не можете (по крайней мере, так, как я ее настроил) одновременно запускать сервер ThriftJdbc и REPL из-за ограничений потоков в Derby. Однако, возможно, если он перенастроен с Postgres или MySQL или подобным, возможен одновременный доступ.