Apache spark Apache Spark是否从目标数据库加载整个数据?

Apache spark Apache Spark是否从目标数据库加载整个数据?,apache-spark,jdbc,vertica,pyspark-sql,Apache Spark,Jdbc,Vertica,Pyspark Sql,我想使用ApacheSpark并通过JDBC连接到Vertica 在Vertica数据库中,我有1亿条记录和spark代码在另一台服务器上运行 当我在Spark中运行查询并监视网络使用情况时,两台服务器之间的通信量非常高 Spark似乎从目标服务器加载所有数据 这是我的代码: test_df = spark.read.format("jdbc") .option("url" , url).option("dbtable", "my_table") .option("user",

我想使用ApacheSpark并通过JDBC连接到Vertica

在Vertica数据库中,我有1亿条记录和spark代码在另一台服务器上运行

当我在Spark中运行查询并监视网络使用情况时,两台服务器之间的通信量非常高

Spark似乎从目标服务器加载所有数据

这是我的代码:

test_df = spark.read.format("jdbc")
    .option("url" , url).option("dbtable", "my_table")
    .option("user", "user").option("password" , "pass").load()

test_df.createOrReplaceTempView('tb')

data = spark.sql("select * from tb")

data.show()
当我运行这个程序时,经过2分钟和非常高的网络使用率,结果返回


Spark是否从目标数据库加载整个数据?

JDBC
基于
DBs
允许下推查询,以便您仅从磁盘读取相关项目:例如:
df.filter(“user_id==2”)。count
将首先选择筛选的记录,然后将count发送给Spark。因此,使用JDBC
1。过滤器计划,2。根据查询模式对数据库进行分区,并进一步优化表单spark端,例如:

val prop = new java.util.Properties
prop.setProperty("driver","org.postgresql.Driver")
prop.setProperty("partitionColumn", "user_id")
prop.setProperty("lowerBound", "1")
prop.setProperty("upperBound", "272")
prop.setProperty("numPartitions", "30")
但是,大多数
relational DB
都是通过树型lke结构中的特定字段进行分区的,这对于复杂的大数据查询来说并不理想:我强烈建议将表从
JDBC
复制到
no-sql
,例如
cassandra
mongo
elastic serach
或文件系统,如
alluxio
hdfs
,以实现可扩展-并行-复杂-快速查询。最后,您可以将
JDBC
替换为
aws redshift
,这对于后端/前端来说应该不难实现,然而,从spark的角度来看,处理重新依赖冲突是一件痛苦的事情,但它将使您能够更快地执行复杂的查询,因为它可以对列进行分区,这样您就可以使用多个辅助对象对列本身进行下推聚合
.

JDBC
基于
DBs
允许下推查询,以便只从磁盘读取相关项:例如:
df.filter(“user\u id==2”)。count
将首先只选择已过滤的记录,然后将count发送给spark。因此,使用JDBC
1。过滤器计划,2。根据查询模式对数据库进行分区,并进一步优化表单spark端,例如:

val prop = new java.util.Properties
prop.setProperty("driver","org.postgresql.Driver")
prop.setProperty("partitionColumn", "user_id")
prop.setProperty("lowerBound", "1")
prop.setProperty("upperBound", "272")
prop.setProperty("numPartitions", "30")
但是,大多数
relational DB
都是通过树型lke结构中的特定字段进行分区的,这对于复杂的大数据查询来说并不理想:我强烈建议将表从
JDBC
复制到
no-sql
,例如
cassandra
mongo
elastic serach
或文件系统,如
alluxio
hdfs
,以实现可扩展-并行-复杂-快速查询。最后,您可以将
JDBC
替换为
aws redshift
,这对于后端/前端来说应该不难实现,然而,从spark的角度来看,处理重新依赖冲突是一件痛苦的事情,但它将使您能够更快地执行复杂的查询,因为它可以对列进行分区,这样您就可以使用多个辅助对象对列本身进行下推聚合
.

spark作业完成后,使用spark作业使用并运行的相同凭据登录Vertica数据库:

SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000;

这将向您显示spark作业发送到数据库的查询,允许您查看它是否将计数(*)下推到数据库,或者它是否确实尝试通过网络检索整个表。

spark作业使用spark作业使用并运行的相同凭据登录Vertica数据库后:

SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000;

这将向您显示spark作业发送到数据库的查询,允许您查看它是否将计数(*)下推到数据库,或者它是否确实试图通过网络检索整个表。

您可以使用
sql(“从spark_表中选择计数(*”)。解释(true)
查看查询计划,这可能会给您提供更多细节。您可以使用
sql(“从spark_表中选择count(*”)。解释(true)
查看查询计划,这可能会给您提供更多细节。对于spark中的此命令:result=df.filter(df.test_col==1.count(),spark在数据库上运行此查询:从事件中选择1(“test_col”不为NULL)并(“test_col”=1)。“select 1”会导致非常高的网络流量以获得较大的结果。如何以不同的方式获取计数?对于spark中的此命令:result=df.filter(df.test_col==1.count(),spark在数据库上运行此查询:从事件中选择1(“test_col”不为NULL)和(“test_col”=1)。“select 1”“造成非常高的网络流量以获得巨大的结果。我怎样才能以不同的方式获得计数?