我通过jdbc
连接到一个有500'000'000行和14列的数据库。
下面是使用的代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
properties = {'jdbcurl': 'jdbc:db:XXXXXXXXX','user': 'XXXXXXXXX', 'password': 'XXXXXXXXX'}
data = spark.read.jdbc(properties['jdbcurl'], table='XXXXXXXXX', properties=properties)
data.show()
上面的代码花了9秒来显示DB的前20行。
后来,我创建了一个SQL临时视图
data[['XXX','YYY']].createOrReplaceTempView("ZZZ")
sqlContext.sql('SELECT AVG(XXX) FROM ZZZ').show()
上面的代码用了1355.79秒(大约23分钟)。这样可以吗?这似乎是一个大量的时间。
最后,我尝试计算数据库的行数
sqlContext.sql('SELECT COUNT(*) FROM ZZZ').show()
用了2848.95秒(约48分钟)。
是我做错了什么,还是这些数额是标准的?
当您使用这种方法读取jdbc源代码时,您就会失去并行性,Spark的主要优点。请阅读正式的spark jdbc指南,特别是关于partitioncolumn
、lowerbound
、upperbound
和numpartitions
的指南。这将允许spark并行运行多个JDBC查询,从而得到分区数据帧。
此外,调优fetchsize
参数可能有助于某些数据库。
我使用的是运行在AWS中的spark独立集群(spark and spark-streaming-kafka version 1.6.1),并对检查点目录使用S3桶,每个工作节点上没有调度延迟和足够的磁盘空间。 没有更改任何Kafka客户端初始化参数,非常肯定Kafka的结构没有更改: 也不明白为什么当直接使用者描述说时,我仍然需要在创建流上下文时使用检查点目录?
Spark v2.4 <代码>火花。sql。调试。此处定义了MaxToString字段https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala 不知何故,它变成了在https://github.com/apache/spark
一些脚本在工作时什么也不做,当我手动运行它们时,其中一个失败了,出现了以下消息: 错误SparkUI:未能绑定SparkUI java.net.bindexception:地址已在使用:服务“SparkUI”在重试16次后失败! 所以我想知道是否有一种特定的方法来并行运行脚本?
1、返回每个部门工资排名前二的员工() A、使用ROW NUMBER()函数并通过子查询过滤 B、使用RANK()函数并通过子查询过滤RANK <2 C、使用DENSE RANK()函数并通过子查询过滤RANK <=2 D、使用NTILE(2)函数 2、SQL排序时希望特定某个值排在最后(如null、Unknow等) A、ORDER BY column name ASC B、ORDER BY co
奔腾家族的处理器内部有一个64位的时钟计数器,通过RDTSC(read time stamp counter,读时间戳计数器)指令可以把它的值读到EDX:EAX寄存器中。 这对于确切测试一块代码用掉的时钟数十分有用。 下面的代码对测试一块代码花去的时钟数很有用。 程序执行要测的代码片段,测试10次,以10个时钟为一个单位,保存用掉的单位数。 这段代码可以在PPlain和PMMX上的16位或32位模