Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark:仅选择特定分区_Apache Spark_Apache Spark Sql_Spark Dataframe_Apache Spark Dataset - Fatal编程技术网

Apache spark 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,

我的RDBMS数据库中有一个巨大的表,其中包含不同帐户类型的记录。 我将此数据加载到spark中一次,并根据帐户类型在该表上循环多次以生成一些报告

我已在此表上创建了一个临时全局视图

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,看看这是否对你有用。如果你成功了,请告诉我