pyspark&jdbc:我应该在什么时候将spark与jdbc结合使用?

6rqinv9w  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(406)

我对spark不是很熟悉,所以如果这是navie,请原谅我。
我有一个hdfs数据湖要处理,可以通过hive和presto、impala和spark(在集群中)查询数据。
但是,spark没有内置的访问控制,出于安全原因,我只能使用hive/presto进行查询。
我的问题
我是否可以在本地安装spark(例如我的笔记本电脑),并使用jdbc连接数据源(hive或presto),如中所示https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html ? 所以我可以使用pyspark的dataframe语法和python而不是sql来查询数据,这对我来说效率更高。
这与使用Pandas读取数据有何不同?在pandas中,数据直接加载到我的笔记本电脑中,因此我只能加载约1百万行数据,否则加载时间会太长。spark(本地安装)会将查询、限制和转换推送到数据源吗?否则,这种方法是没有用的。
使用presto(在集群中)和spark(本地机器)w/jdbc来实现presto的速度有什么不同?
谢谢!

lymgl2op

lymgl2op1#

是的,您可以在本地安装spark并使用jdbc连接到您的数据库。下面是一个帮助您连接到my sql的函数,您可以通过更改jdbc连接字符串将其推广到任何jdbc源代码:

def connect_to_sql(
        spark, jdbc_hostname, jdbc_port, database, data_table, username, password
):
    jdbc_url = "jdbc:mysql://{0}:{1}/{2}".format(jdbc_hostname, jdbc_port, database)

    connection_details = {
        "user": username,
        "password": password,
        "driver": "com.mysql.cj.jdbc.Driver",
    }

    df = spark.read.jdbc(url=jdbc_url, table=data_table, properties=connection_details)
    return df

spark比pandas更擅长处理大数据,即使在本地机器上也是如此,但由于并行性和分布式计算,spark会带来性能开销。在集群上,它肯定能满足您的需求,但是本地模式只能用于开发。
请放心,spark(本地安装)将推送查询、限制和转换限制,如果操作正确,甚至可以更好地处理它。由于df是一种无索引的分布式数据结构,搜索、排序和过滤操作的开销将非常大。
不知道普雷斯托和斯帕克之间的速度差异,也没有尝试过比较。
希望这有帮助。
注意:即使有最佳的并行工作负载,在本地机器上也不能保证性能的提高。它不提供分销机会。

相关问题