2016-09-22 9 views
2

xerialのsqlite-jdbcthis exampleを使用して、Pythonのsqlite3データベースにSparkデータフレームを書き込もうとしています。 私はPysparkからJDBC経由でsqlite3データベースに書き込むときにこのテーブルはありません

java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: test) 

データベースファイルhello.dbは、実際に私はそれがドライバを見つけるためにspark-submit --jars ../extras/sqlite-jdbc-3.8.11.2.jar example.pyでそれを実行しています

sqlite> .schema test 
CREATE TABLE test (age BIGINT , name TEXT); 

スキーマを持つテーブルtestで作成されたエラーを取得しています。

私はSpark 1.6.0を実行しています。一般に

(たぶん)再現例えば

import os 
os.environ["SPARK_HOME"] = "/usr/lib/spark" 
import findspark 
findspark.init() 
from pyspark import SparkConf, SparkContext 
from pyspark.sql import SQLContext 

config = { 
      "spark.cores.max": "5", 
      "spark.master" : "spark://master2:7077", 
      "spark.python.profile": "false", 
      "spark.ui.enabled": "false", 
      "spark.executor.extraClassPath": "../extras/sqlite-jdbc-3.8.11.2.jar", 
      "spark.driver.extraClassPath": "../extras/sqlite-jdbc-3.8.11.2.jar", 
      "spark.jars": "../extras/sqlite-jdbc-3.8.11.2.jar" 
     } 

conf = SparkConf() 
for key, value in config.iteritems(): 
     conf = conf.set(key, value) 

sc = SparkContext(appName="test", conf=conf) 
sqlcontext = SQLContext(sc) 

d = [{'name': 'Alice', 'age': 31}] 
df = sqlcontext.createDataFrame(d) 

url = "jdbc:sqlite:hello.db" 
df.write.jdbc(url=url, table="test", mode="overwrite", properties={"driver":"org.sqlite.JDBC"}) 
+0

私はそれが動作する方法を混乱しています。すべてのエグゼキュータは個別にライターを実行するので、ファイルベースのデータベースを使用することはあまり意味がありません。 – zero323

+0

私も混乱しています:)。私はあなたが何を意味するかを見て、ドライバがテーブルを作成することを意味していると推測します。exectorは見ることができません。外部のmysqlサーバにはもっと意味がありますか? このケースの回避策はありますか、手動で収集()して手動で行う必要はありますか? – bytesinflight

+1

これをsimples実験以外のものにしたいのであれば、少なくとも適切なデータベースサーバ(通常、各エグゼキュータから並列にアクセスできるシンク)が必要です。 – zero323

答えて

2

各スパークエグゼキュータ行うデータソースとシンクが各ワーカーノードからアクセス可能でなければなら読み取り、別々に書き込みます。一般的に、このシナリオではSQLiteをむしろ無駄にしています(ただし、ローカル検索では役に立ちます)。

出力を非ローカルモードでデータベースに保存するには、適切なデータベースサーバーが必要です。

+0

これはとても分かりやすく、明確で迅速な回答に感謝しています。 – bytesinflight

関連する問題