Cassandra将其分区暴露为多行,但内部存储为宽行,这就是我希望使用Spark处理数据的方式。
更具体地说,我将以某种方式获得Cassandra分区的RDD或这些分区的数据帧。
然后我想做一个map
操作,在闭包中,我想表达这样的话:
row['parameter1']['value'] / len(row['parameter2']['vector_value'])
伪代码只是为了给出一个想法,一个简单的划分并采用向量的长度。
我的桌子是
create table(
dataset_name text,
parameter text,
value real,
vector_value list<real>,
primary key(dataset_name, parameter));
我怎样才能有效地做到这一点?与PySpark一起使用。
我想我需要像Pandas set_index
这样的东西。
答案 0 :(得分:1)
逻辑上,RDD group在我看来是你想要做的。 RDD groupBy据说对大型分组不利,但是我们在这里分组cassandra分区,因此它应该保存在spark分区中,它应该是本地的,因为一个分区的所有行都在同一节点。
我更多地使用Scala和Spark而不是Python,所以让我们试试吧。但我没有测试过它。 我建议
rdd = sc.cassandraTable(&#39; keyspace&#39;,&#39; table&#39;)。map(lambda x:((x.dataset_name,(x.parameter,value,vector_value))) //创建分组的键
rdd2 = sorted(rdd.groupByKey())// GroupByKey返回(key,Iterator),因此排序得到一个列表
查看groupBy / groupByKey函数
http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD
每个分区将获得一行,并在每个分区内获得一组聚类行。所以你应该能够在第一次出现时使用[0]进行访问,然后参数1&#39;然后[1]进入&#39;参数2&#39;
编辑:一位同事告诉我,spark-cassandra-connector提供RDD方法来制作你想要的东西,即保留群集列分组和排序。它们被称为spanBy / spanByKey:https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md#grouping-rows-by-partition-key