3

save to JDBCに関連して、テキスト ファイルをインポートし、レポート ツールでインポートするために Hive JDBC ファイルに保存しようとしています。

spark-1.5.1-bin-hadoop2.6 (マスター + 1 スレーブ)、JDBC thrift サーバー、およびビーライン クライアントを実行しています。それらはすべて相互に接続して通信しているように見えます。私が理解していることから、Hive はこのリリースの datanucleus jar に含まれています。Hive ファイルを保持するようにディレクトリを構成しましたが、conf/hive-config.xml がありません。

簡単な入力 CSV ファイル:

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

ユーザーテーブルは、ビーラインクライアントで事前に作成されています

 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)

私が間違っているアイデアはありますか?このバージョンでは、実際に DataFrame から JDBC ファイルを書き込むことができますか?

助けてくれてありがとう!

ジョン

4

1 に答える 1

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>

もう 1 つの重要な点は、Derby を Hive バッキング データベースとして使用すると、Derby のスレッド制限のために、ThriftJdbc サーバーと REPL の両方を同時に実行することはできません (少なくとも私が構成した方法では) ことです。ただし、Postgres や MySQL などで再構成すれば、同時アクセスが可能になるかもしれません。

于 2015-11-20T01:13:13.647 に答える