如何使Cassandra分区感觉像Spark中的宽行?

时间:2016-03-21 11:10:44

标签: apache-spark cassandra spark-cassandra-connector

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这样的东西。

1 个答案:

答案 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