xerialのsqlite-jdbcとthis 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"})
私はそれが動作する方法を混乱しています。すべてのエグゼキュータは個別にライターを実行するので、ファイルベースのデータベースを使用することはあまり意味がありません。 – zero323
私も混乱しています:)。私はあなたが何を意味するかを見て、ドライバがテーブルを作成することを意味していると推測します。exectorは見ることができません。外部のmysqlサーバにはもっと意味がありますか? このケースの回避策はありますか、手動で収集()して手動で行う必要はありますか? – bytesinflight
これをsimples実験以外のものにしたいのであれば、少なくとも適切なデータベースサーバ(通常、各エグゼキュータから並列にアクセスできるシンク)が必要です。 – zero323