Apache spark Apache Spark是否从目标数据库加载整个数据?
我想使用ApacheSpark并通过JDBC连接到Vertica 在Vertica数据库中,我有1亿条记录和spark代码在另一台服务器上运行 当我在Spark中运行查询并监视网络使用情况时,两台服务器之间的通信量非常高 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",
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。因此,使用JDBC1。过滤器计划,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。因此,使用JDBC1。过滤器计划,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”“造成非常高的网络流量以获得巨大的结果。我怎样才能以不同的方式获得计数?