将数据导入Spark时如何设置分区/节点数

pem*_*fir 14 sql database-partitioning apache-spark pyspark-sql

问题:我想使用以下方法将数据从S3导入Spark EMR:

data = sqlContext.read.json("s3n://.....")
Run Code Online (Sandbox Code Playgroud)

有没有办法可以设置Spark用来加载处理数据的节点数量?这是我处理数据的示例:

data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")
Run Code Online (Sandbox Code Playgroud)

上下文:数据不是太大,需要很长时间才能加载到Spark中,也需要查询.我认为Spark将数据划分为太多节点.我希望能够手动设置.我知道在处理RDD时sc.parallelize我可以将分区数作为输入传递.此外,我已经看到了repartition(),但我不确定它是否可以解决我的问题.在我的例子中,变量data是一个DataFrame.

让我更准确地定义分区.定义一个:通常被称为"分区键",其中一列中选择和索引,以加快查询(这不是我想要的).定义二:(这是我关注的地方)假设你有一个数据集,Spark决定它将它分布在许多节点上,以便它可以并行地对数据进行操作.如果数据量太小,这可能会进一步减慢进程.我该如何设置该值

Dur*_*aju 11

默认情况下,它分为200组.您可以在sql上下文中使用set命令进行更改sqlContext.sql("set spark.sql.shuffle.partitions=10");.但是,您需要根据数据特征谨慎设置它.

  • 那么你如何弄清楚要设置它的内容呢?什么“数据特征”? (2认同)

Raj*_*tti 6

您可以调用repartition()dataframe来设置分区.您甚至可以spark.sql.shuffle.partitions在创建hive上下文或传递给spark-submit jar后设置此属性:

spark-submit .... --conf spark.sql.shuffle.partitions=100
Run Code Online (Sandbox Code Playgroud)

要么

dataframe.repartition(100)
Run Code Online (Sandbox Code Playgroud)