在SparkSQL中,读取数据的时候可以分块读取。例如下面这样,指定了partitionColumn,lowerBound,upperBound,numPartitions等读取数据的参数。简单来说,就是并行读取。
关于这四个参数的意思,SparkSQL官方解释是:
Property Name
|
Meaning
|
partitionColumn, lowerBound, upperBound
|
These options must all be specified if any of them is specified. In addition, numPartitions must be specified. They describe how to partition the table when reading in parallel from multiple workers. partitionColumn must be a numeric column from the table in question. Notice that lowerBound and upperBound are just used to decide the partition stride, not for filtering the rows in table. So all rows in the table will be partitioned and returned. This option applies only to reading.
|
numPartitions
|
The maximum number of partitions that can be used for parallelism in table reading and writing. This also determines the maximum number of concurrent JDBC connections. If the number of partitions to write exceeds this limit, we decrease it to this limit by calling coalesce(numPartitions) before writing.
|
从上面的解释来看,分区列得是数字类型;所谓的并行读取其实就是开了多个数据库连接,分块读取的。另外需要注意的是:
Notice that lowerBound and upperBound are just used to decide the partition stride, not for filtering the rows in table. So all rows in the table will be partitioned and returned.
也就是说,这些参数的设置不会过滤数据,所以sql中读取了多少数据,那么返回的就是多少条数据,lowerBound和upperBound并不会过滤数据。那么如果说设置的lowerBound偏大(可能读取的数据中分区列的值比这个小),或者设置的upperBound数值设置的大小偏小(可能读取的数据中分区列中最大的值比upperBound大),这个时候数据是怎么读取和返回的呢?
举个例子:
如果一个表分10个分区读取,id为分区列,其值从0-101,但是设置的lowerBound是1,upperBound是100,那么读取的规则如下:
第一个分区:select * from tablename where id<=10;
第二个分区:select * from tablename where id >=10 and id<20;
第三个分区:select * from tablename where id >=20 and id <30;
……
第十个分区:select * from tablename where id >=90;
spark = SparkSession.builder\
.appName('spark-oracle')\
.enableHiveSupport()\
.getOrCreate()
d_sql = "(select t.*,ROWNUM rownum_rn from ******* t)"
d_oracle = spark.read.format('jdbc')\
.option("url",'jdbc:oracle:thin:@//******')\
.option('dbtable',d_sql)\
.option('user','****')\
.option('password','****')\
.option('fetchsize',100000)\
.option('partitionColumn','rownum_rn')\
.option('lowerBound',0)\
.option('upperBound',500000)\
.option('numPartitions',5)\
.load()\
.drop('rownum_rn')
d_oracle.show(10)
# 情况一:
if partitionColumn || lowerBound || upperBound || numPartitions 有任意选项未指定,报错
# 情况二:
if numPartitions == 1 忽略这些选项,直接读取,返回一个分区
# 情况三:
if numPartitions > 1 && lowerBound > upperBound 报错
# 情况四:
numPartitions = min(upperBound - lowerBound, numPartitions)
if numPartitions == 1 同情况二
else 返回numPartitions个分区
delta = (upperBound - lowerBound) / numPartitions
分区1数据条件:partitionColumn <= lowerBound + delta || partitionColumn is null
分区2数据条件:partitionColumn > lowerBound + delta && partitionColumn <= lowerBound + 2 * delta
最后分区数据条件:partitionColumn > lowerBound + n*delta
在SparkSQL中,读取数据的时候可以分块读取。例如下面这样,指定了partitionColumn,lowerBound,upperBound,numPartitions等读取数据的参数。简单来说,就是并行读取。关于这四个参数的意思,SparkSQL官方解释是:Property Name Meaning partitionColumn, lowerBound, upperBound These options must all be specified if any ...
更好的操纵杆允许用户与Arduino操纵杆组件进行交互。 它提供了对于操纵杆有意义的简单但有用的功能。
可以通过Arduino IDE中的库管理器安装Better Joystick。
可以使用构造函数中的相关引脚创建一个简单的Joystick对象,如下所示:
Joystick joystick(A0, A1, 7);
Joystick类包含许多可以以类似方式调用的方法。
int x()
检索操纵杆的x位置
joystick.x()
int y()
检索操纵杆的y位置
joystick.y()
int x(const int lowerBound,const int upperBound);
从lowerBound映射到lowerBound , upperBound之后,检索x位置。
int y(
partitionColumn:分区字段,需要是数值类的(partitionColumn must be a numeric column from the table in question.),经测试,除整型外,float、double、decimal都是可以的
lowerBound:下界,必须为整数
upperBound:上界,必须为整数
numPartitions:最大分...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录前言一、SparkSql读取mysql慢优化二、spark写入mysql数据慢1.批量写入mysql数据2.计算完之后在重新分区,防止数据倾斜写入的时候特别慢3.调整shuffle的分区数量三、SparkSql关联查的坑1.spark 区分大小写 mysql不区分,关联查的时候尽量都转大写,并且要去除前后空格2.SparkSql时区问题3.spark在进行比较或者过滤的时候是区分类型的
SparkSqk读mysql计算写入m
如何理解SparkSQL中的partitionColumn, lowerBound, upperBound, numPartitions
在SparkSQL中,读取数据的时候可以分块读取。例如下面这样,指定了partitionColumn,lowerBound,upperBound,numPartitions等读取数据的参数。简单来说,就是并行读取。
关于这四个参数的意思,SparkSQL官方解释是:
利用SparkSQL读取数据库数据的时候,如果数据量很大,那么在读取数据的时候就会花费大量的时间,因此,怎么让数据并行读取加快读取数据的速度呢?
在SparkSQL中,读取数据的时候可以分块读取。例如下面这样,指定了partitionColumn,lowerBound,upperBound,numPartitions等读取数据的参数。
关于这四个参数的意思,Spark
SparkSql的repartition和coalesceSparkSql 写hive小文件后记
repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)
作用:对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true
例:RDD有N个分区,需要...
spark sql 并行查询
第一种使用指定分区列的方式
http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases
partitionColumn must be a numeric, date, or timestamp column from the table in question.
partitionColumn, lowerBound, upperBound These optio
spark运行报错:java.io.IOException: (null) entry in command string: null chmod 0644(windows 环境)
adviseRed:
spark运行报错:java.io.IOException: (null) entry in command string: null chmod 0644(windows 环境)
ai生活的码农:
spark运行报错:java.io.IOException: (null) entry in command string: null chmod 0644(windows 环境)
Lv杰克船长: