Apache spark Spark数据表:partitionBy在哪里?

Apache spark Spark数据表:partitionBy在哪里?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我们常见的火花处理流程如下: 装载: rdd = sqlContext.parquetFile("mydata/") rdd = rdd.map(lambda row: (row.id,(some stuff))) rdd = rdd.filter(....) rdd = rdd.partitionBy(rdd.getNumPatitions()) 按id处理(这就是为什么我们要按上面的分区!) 但是,Spark 1.3将sqlContext.parquetFile更改为返回DataFrame

我们常见的火花处理流程如下:

装载:

rdd = sqlContext.parquetFile("mydata/")
rdd = rdd.map(lambda row: (row.id,(some stuff)))
rdd = rdd.filter(....)
rdd = rdd.partitionBy(rdd.getNumPatitions())
id
处理(这就是为什么我们要按上面的
分区
!)

但是,Spark 1.3将
sqlContext.parquetFile
更改为返回
DataFrame
,而不是
RDD
,并且它不再具有
partitionBy
getNumPartitions
reduceByKey
方法

我们现在使用
partitionBy
做什么?

我们可以用以下内容替换加载代码

rdd = sqlContext.parquetFile("mydata/").rdd
rdd = rdd.map(lambda row: (row.id,(some stuff)))
rdd = rdd.filter(....)
rdd = rdd.partitionBy(rdd.getNumPatitions())
df = rdd.map(lambda ...: Row(...)).toDF(???)
并使用
groupBy
而不是
reduceByKey

这条路对吗


PS.是的,我知道
partitionBy
对于
groupBy
等没有必要。但是,如果没有先前的
partitionBy
,每个
加入
groupBy
&c可能必须进行跨节点操作。我正在寻找一种方法来保证所有需要按我的键分组的操作都将运行本地,因为
数据帧
为我们提供了
RDD
的抽象,操作
DataFrame
最方便的方法是使用这些抽象以及DataFrame为我们提供的特定表操作方法

在数据帧上,我们可以:

  • 使用
    select()
    \
    udf()
    \
    as()
  • 通过
    filter()
    where()
  • 通过
    groupBy()
    agg()
  • 或使用
    sample()
    \
    join()
    \
    union()
  • 使用
    saveAsTable()
    \
    saveAspQuet()
    \
    insertIntoJDBC()
有关更多详细信息,请参阅

因此,一个常见的作业如下所示:

val people=sqlContext.parquetFile(“…”)
val department=sqlContext.parquetFile(“…”)
人员筛选(“年龄>30岁”)
.加入(部门、人员(“部门id”)==部门(“id”))
.groupBy(部门名称,性别)
.agg(平均(人(“工资”)),max(人(“年龄”))
对于您的特定需求,这可能看起来像:

val t=sqlContext.parquetFile()
t、 过滤器().select().groupBy().agg()

看来,由于版本1.6,它满足了我的需要:

.. versionchanged:: 1.6
添加了可选参数以指定分区列。 如果指定了分区列,还将
numPartitions
设置为可选


谢谢然而,最重要的问题是:我如何做
partitionBy
?@sds,id是一个列名?@sds,那么你的意思是根据一个键对数据进行洗牌,然后按键进行缩减?是的,我想按键进行分区,然后再对其执行许多操作:聚合、联接和c&c@sds,您只需通过
groupBy('id')
即可完成此任务,spark sql会将此转换为重新分区(partitionBy)过程
.. versionchanged:: 1.6