问题:我想使用以下方法将数据从S3导入Spark EMR:
data = sqlContext.read.json("s3n://.....")
有没有办法可以设置Spark用来加载和处理数据的节点数量?这是我处理数据的示例:
data.registerTempTable("table") SqlData = sqlContext.sql("SELECT * FROM table")
上下文:数据不是太大,需要很长时间才能加载到Spark中,也需要查询.我认为Spark将数据划分为太多节点.我希望能够手动设置.我知道在处理RDD时sc.parallelize
我可以将分区数作为输入传递.此外,我已经看到了repartition()
,但我不确定它是否可以解决我的问题.在我的例子中,变量data
是一个DataFrame
.
让我更准确地定义分区.定义一个:通常被称为"分区键",其中一列中选择和索引,以加快查询(这不是我想要的).定义二:(这是我关注的地方)假设你有一个数据集,Spark决定它将它分布在许多节点上,以便它可以并行地对数据进行操作.如果数据量太小,这可能会进一步减慢进程.我该如何设置该值
默认情况下,它分为200组.您可以在sql上下文中使用set命令进行更改sqlContext.sql("set spark.sql.shuffle.partitions=10");
.但是,您需要根据数据特征谨慎设置它.
您可以调用repartition()
dataframe来设置分区.您甚至可以spark.sql.shuffle.partitions
在创建hive上下文或传递给spark-submit jar后设置此属性:
spark-submit .... --conf spark.sql.shuffle.partitions=100
要么
dataframe.repartition(100)