我正在尝试从存储在本地磁盘上的 SQLLite .db 文件加载表。在 PySpark 中是否有任何干净的方法可以做到这一点?
目前,我正在使用一种可行但不够优雅的解决方案。首先,我通过 sqlite3 使用 pandas 读取表格。一个问题是在此过程中架构信息未传递(可能是问题,也可能不是问题)。我想知道是否有一种不使用 Pandas 直接加载表格的方法。
import sqlite3
import pandas as pd
db_path = 'alocalfile.db'
query = 'SELECT * from ATableToLoad'
conn = sqlite3.connect(db_path)
a_pandas_df = pd.read_sql_query(query, conn)
a_spark_df = SQLContext.createDataFrame(a_pandas_df)
似乎有一种使用 jdbc 的方法来做到这一点,但我还没有弄清楚如何在 PySpark 中使用它。
因此,您需要的第一件事是在路径中使用 JDBC 驱动程序 jar 启动 pyspark 下载 sqllite jdbc 驱动程序并在下面提供 jar 路径。 https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.8.6.jar
pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>
有关上述 pyspark 命令的说明,请参阅下面的帖子
现在您可以这样做:-
现在要读取sqlite数据库文件,只需将其读入spark dataframe即可
df = sqlContext.read.format('jdbc').\
options(url='jdbc:sqlite:Chinook_Sqlite.sqlite',\
dbtable='employee',driver='org.sqlite.JDBC').load()
df.printSchema()
查看您的架构。
完整代码:- https://github.com/charles2588/bluemixsparknotebooks/blob/master/Python/sqllite_jdbc_bluemix.ipynb
谢谢, 查尔斯.
基于@
charles gomes
答案:
from pyspark.sql import SparkSession
spark = SparkSession.builder\
.config('spark.jars.packages', 'org.xerial:sqlite-jdbc:3.34.0')\
.getOrCreate()
df = spark.read.format('jdbc') \
.options(driver='org.sqlite.JDBC', dbtable='my_table',
url='jdbc:sqlite:/my/path/alocalfile.db')\
.load()
对于其他 JAR 版本,请参考 Maven 存储库
如果我在 datalake gen 2 存储中有 sqlite 文件,这将不起作用。那么如何通过 Az 存储实现此目的。