Apache spark Spark:仅选择特定分区
我的RDBMS数据库中有一个巨大的表,其中包含不同帐户类型的记录。 我将此数据加载到spark中一次,并根据帐户类型在该表上循环多次以生成一些报告 我已在此表上创建了一个临时全局视图Apache spark Spark:仅选择特定分区,apache-spark,apache-spark-sql,spark-dataframe,apache-spark-dataset,Apache Spark,Apache Spark Sql,Spark Dataframe,Apache Spark Dataset,我的RDBMS数据库中有一个巨大的表,其中包含不同帐户类型的记录。 我将此数据加载到spark中一次,并根据帐户类型在该表上循环多次以生成一些报告 我已在此表上创建了一个临时全局视图 df.createOrReplaceGlobalTempView("account_tbl") 现在,我想根据account_类型列将此视图划分为多个分区,其中数据被划分为块,因此每次我循环查看account_类型时,我只想选择该特定分区 对特定列进行重新分区可以轻松解决此问题吗?如果是,我是否需要重新划分df,
df.createOrReplaceGlobalTempView("account_tbl")
现在,我想根据account_类型列将此视图划分为多个分区,其中数据被划分为块,因此每次我循环查看account_类型时,我只想选择该特定分区
对特定列进行重新分区可以轻松解决此问题吗?如果是,我是否需要重新划分df,然后创建一个全局临时视图,或者我对此不确定。
还有,我如何确保每次循环时只选择特定的分区。
请告知。例如,您可以使用
df.重新分区(分区大小、列(“帐户类型”))
。在这里,我设置了分区大小和要分区的列。否则,如果要使用Spark SQL,可以使用:
SET spark.sql.shuffle.partitions = partition_size
SELECT * FROM df CLUSTER BY account_type
CLUSTER BY
的工作原理类似于重新分区,但它也会对数据帧进行排序
要使用与下一个分区类似的代码访问每个分区内的数据,请执行以下操作:
df.foreachPartition {
p => /*your code goes here*/
}
在中,您可以进行所有计算并生成所需的报告
要估计分区大小,可以从默认值开始,例如:200,如果在洗牌过程中出现内存不足异常,可以增加分区数,例如1024,直到作业成功执行。没有标准的方法来计算分区的确切数量,因为它取决于多个因素,如集群的大小(可用内核、内存)和数据大小
此外,由于RDD在集群中随机分布,因此无法确定分区将包含哪些数据。确定这一点的唯一方法是在foreachPartition中使用自定义过滤器。例如,您可以应用自定义条件,如下所示:
df.foreachPartition( iter => {
iter.foreach { i =>
if(i.some_column == "somevalue")
//write populate data
}
})
祝你好运@@Alexandros,谢谢你的回复。只有几件事,我可以做SparkSQL或重新分区。1.在这两种情况下,如何确定分区大小?2.如何验证仅选择了该分区?3.一旦重新分区,我还需要加入其他数据帧。所以我不知道如何继续使用foreachPartition选项?请给出建议@@Alexandros,谢谢您的及时回复。向上投票:)谢谢@1pluszara:)我是curius,看看这是否对你有用。如果你成功了,请告诉我