将数据导入Spark

时间:2016-01-04 18:56:31

标签: 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将数据划分为太多节点。我希望能够手动设置。我知道在处理RDD和sc.parallelize时我可以将分区数作为输入传递。另外,我看过repartition(),但我不确定它是否可以解决我的问题。在我的示例中,变量dataDataFrame

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:6)

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

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

dataframe.repartition(100)

答案 2 :(得分:1)

"输入"分区由文件系统配置修复。

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

重新分区可能非常糟糕,如果你有很多输入分区,这将在分区之间进行大量的随机播放(数据流量)。

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