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

Sql 将数据导入Spark时如何设置分区/节点数,sql,apache-spark,database-partitioning,pyspark-sql,Sql,Apache Spark,Database Partitioning,Pyspark Sql,问题:我想使用以下方法将数据从S3导入Spark EMR: data = sqlContext.read.json("s3n://.....") 是否有一种方法可以设置Spark用于加载和处理数据的节点数?这是我如何处理数据的一个示例: data.registerTempTable("table") SqlData = sqlContext.sql("SELECT * FROM table") 上下文:数据不是太大,加载到Spark和从Spark进行查询需要很长时间。我认为Spark将数据划

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

data = sqlContext.read.json("s3n://.....")
是否有一种方法可以设置Spark用于加载和处理数据的节点数?这是我如何处理数据的一个示例:

data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")
上下文:数据不是太大,加载到Spark和从Spark进行查询需要很长时间。我认为Spark将数据划分为太多的节点。我希望能够手动设置。我知道在处理RDD和sc.parallelize时,我可以将分区数作为输入传递。此外,我还看到了
重新分区()
,但我不确定它是否能解决我的问题。变量
data
在我的示例中是一个
DataFrame


让我更精确地定义分区。定义一:通常被称为“分区键”,其中一列被选择并索引以加速查询(这不是我想要的)。定义二:(这就是我关注的地方)假设您有一个数据集,Spark决定将它分布在多个节点上,以便它可以并行地对数据运行操作。如果数据大小太小,这可能会进一步降低处理速度。如何设置该值?默认情况下,它会划分为200组。您可以在sql上下文
sqlContext.sql(“set spark.sql.shuffle.partitions=10”)中使用set命令来更改它。但是,您需要根据数据特征谨慎地进行设置。

您可以在dataframe上调用
repartition()
来设置分区。您甚至可以在创建配置单元上下文后或通过传递到spark submit jar来设置
spark.sql.shuffle.partitions
此属性:

spark-submit .... --conf spark.sql.shuffle.partitions=100

“输入”分区的数量由文件系统配置固定

1个1Go文件,块大小为128M,将为您提供10个任务。我不确定你能不能改变它

重新分区可能非常糟糕,如果您有很多输入分区,这将在分区之间造成大量的混乱(数据流量)


没有神奇的方法,您必须尝试,并使用webUI查看生成了多少任务。

可能的重复让我更精确地定义分区。定义一:通常被称为“分区键”,其中一列被选择并索引以加快查询速度。定义二:(这就是我关注的地方)假设您有一个数据集,Spark决定将它分布在多个节点上,以便它可以并行地对数据运行操作。如果数据大小太小,这可能会进一步降低处理速度。我如何设置该值?您在明确区分关系数据库中的表分区和RDD分区时是正确的。请参阅,它描述了如何进行数据帧分区,如在RDD/分布式分区中。那么您如何确定设置它的方式呢?什么是“数据特征”?
dataframe.repartition(100)