如何从 PySpark 的 SQLite db 文件加载表?

Posted

技术标签:

【中文标题】如何从 PySpark 的 SQLite db 文件加载表?【英文标题】:How to load table from SQLLite db file from PySpark? 【发布时间】:2016-08-16 22:16:54 【问题描述】:

我正在尝试从存储在本地磁盘上的 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 中使用它。

【问题讨论】:

什么架构信息?你是说数据类型?并不是说 sqlite 真的 有它们...... 【参考方案1】:

首先,您需要在路径中使用 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命令的解释,见下文

Apache Spark : JDBC connection not working

现在你会怎么做:-

现在要读取 sqlite 数据库文件,只需将其读入 spark 数据帧

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

谢谢, 查尔斯。

【讨论】:

【参考方案2】:

基于@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 Repository

【讨论】:

以上是关于如何从 PySpark 的 SQLite db 文件加载表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Android 程序的 SQLite Manager 应用程序中使用我创建的 SQLite DB

如何从 sqlite DB 中列出表名——Android [重复]

如何修复:Jooq 代码不会从 sql 脚本为内存 db 中的 sqlite 生成 java 代码

如何将 SQLite .db 添加到 C#.NET 项目中

如何从我的 servlet 类访问放置在 /tmp 文件夹中的 sqlite db 文件?

如何在从cordova创建的本机代码中使用相同的android SQLite DB?