Optimization Spark在同一RDD上多次按多个字段分组

Optimization Spark在同一RDD上多次按多个字段分组,optimization,apache-spark,group-by,aggregate,pyspark,Optimization,Apache Spark,Group By,Aggregate,Pyspark,我的数据以csv格式存储,标题在列\u name变量中给出 我编写了以下代码将其读入python字典RDD rdd=sc.textFile(hdfs_csv_dir)\ .map(lambda x: x.split(','))\ .filter(lambda row: len(row)==len(column_names))\ .map(lambda row: dict([(column,row[index]) for index,column in enumerate(column_names

我的数据以
csv
格式存储,标题在
列\u name
变量中给出

我编写了以下代码将其读入python字典RDD

rdd=sc.textFile(hdfs_csv_dir)\
.map(lambda x: x.split(','))\
.filter(lambda row: len(row)==len(column_names))\
.map(lambda row: dict([(column,row[index]) for index,column in enumerate(column_names)]))
接下来,我编写了一个函数,该函数计算给定列名的列值组合

import operator
def count_by(rdd,cols=[]):
    '''
    Equivalent to:
     SELECT col1, col2, COUNT(*) FROM MX3 GROUP BY col1, col2;
    But the number of columns can be more than 2
    '''
    counts=rdd.map(lambda x: (','.join([str(x[c]) for c in cols]), 1))\
    .reduceByKey(operator.add)\
    .map(lambda t:t[0].split(',')+[t[1]])\
    .collect()
    return counts
我运行了几次
countby
,在同一
rdd
上有许多不同的参数


优化查询并使其运行更快的最佳方法是什么?

首先,您应该缓存RDD(通过调用
cachedRdd=RDD.cache()
),然后将其多次传递到
count\u by
,以防止Spark为每次操作从磁盘加载它。在缓存的RDD上操作意味着数据将在第一次使用时加载到内存中(第一次调用
count\u by
),然后从内存中读取以进行后续调用

您还应该考虑使用SCAR而不是低级RDDAPI,因为:

  • 您似乎使用SQL清楚地表达了您的意图,而DataFrameAPI允许您实际使用这种方言
  • 当使用数据帧时,Spark可以执行一些额外的优化,因为它更好地了解您正在尝试做什么,因为它可以设计实现它的最佳方式。类似SQL的方言是不宽容的——你只说你想要的,而不说如何得到它,这给了Spark更多的优化自由

如果我要查询多个
从(..)中选择c1、c2、count(*)
从同一个源(表示为
(..)
),SparkSQL会自己缓存它吗?我想你还是要缓存它,或者调用
dataframe.RegisterEmptable(“表名”)
,我想这会达到同样的效果