Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 基于Spark的RDD和元组操作_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 基于Spark的RDD和元组操作

Apache spark 基于Spark的RDD和元组操作,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我刚刚开始使用Spark,我有一个问题,我真的不知道如何解决 我的输入是以下形式的RDD: [(u'7362', (u'2016-06-29 09:58:35', 0)), (u'8600', (u'2016-06-29 20:47:27', 1)), (u'f9f8', (u'2016-07-01 00:48:55', 2)), (u'c6c9', (u'2016-07-04 20:29:19', 3)), (u'218b', (u'2016-07-05 20:54:45', 4))] 所以

我刚刚开始使用Spark,我有一个问题,我真的不知道如何解决

我的输入是以下形式的RDD:

[(u'7362', (u'2016-06-29 09:58:35', 0)), (u'8600', (u'2016-06-29 20:47:27', 1)), (u'f9f8', (u'2016-07-01 00:48:55', 2)), (u'c6c9', (u'2016-07-04 20:29:19', 3)), (u'218b', (u'2016-07-05 20:54:45', 4))]
所以结构是

[(user_id, (time_stamp, index))]
我需要做的是返回一个列表列表,或者元组列表

如果我们以表格格式查看RDD,这会更容易。假设这是上面rdd中更经典的表格形式

[(u'7362', (u'2016-06-29 09:58:35', 0)), 
(u'8600', (u'2016-06-29 20:47:27', 1)), 
(u'7362', (u'2016-07-01 00:48:55', 2)), 
(u'c6c9', (u'2016-07-04 20:29:19', 3)), 
(u'8600', (u'2016-07-05 20:54:45', 4))]
我首先需要按用户对这个RDD进行分组,因此我将得到三个RDD,每个用户一个,非重复用户一个

[(u'7362', (u'2016-06-29 09:58:35', 0)), 
(u'7362', (u'2016-07-01 00:48:55', 2))]

[(u'8600', (u'2016-06-29 20:47:27', 1)), 
(u'8600', (u'2016-07-05 20:54:45', 4))]

[(u'c6c9', (u'2016-07-04 20:29:19', 3))]

现在,对于只包含一个用户ID的表,首先需要对每行与前一行的时间差进行比较,并且对于每个前一个索引的索引,考虑这些表的行数超过2行。 这将给出如下表格:

[(u'7362', (35, 2)), (u'7362', (21, 1)), (u'7362', (12, 3)), (u'7362', (41, 2)), (u'7362', (46, 2)), (u'7362', (31, 1)), (u'7362', (97, 3)) ...]
对于第一个用户_id

[(u'8600', (78, 2)), (u'8600', (43, 1)), (u'8600', (99, 3)), (u'8600', (3, 2)), (u'8600', (15, 2)), (u'8600', (42, 1)), (u'8600', (11, 3)) ...]
依此类推,对于所有用户,格式为[user_idx,dt=t2-t1,didx=idx2-idx1],通过从当前行值中减去所有行的前一行值来获取dt和didx

最后,当我拥有上述所有表时,对于每个用户,我希望将它们分组到一个嵌套列表中,如下所示:

[[1, [21, 31, 43, 42]], [2, [35, 41, 46, 78, 3, 15]], [3, [12, 97, 99, 11]]]
所以最终的格式是[[didx,[dt1,dt2…]],在这里我不再关心用户ID,只关心索引和所有用户与同一索引相关的每个时差


我试图尽可能清楚地解释这个问题,但是,正如我所说的,我刚刚开始使用Spark,我知道这里没有真正的表。

按用户ID分组时,这不会导致多个RDD,而是一个RDD形式的RDD[用户ID,列表[时间,索引].因此,在本例中,我将执行groupBy,然后将用户列表处理为格式,然后按照您所说的didx进行groupBy,最后从RDD收集结果以列出

# assume each user has more than one event 
# if this ^ assumption is incorrect, you could filter the RDD before processing to get rid of users 
# with only one event
# also, assume timesteps can be subtracted (there are libraries for this)
def process(indexedTimes):
    num_times = len(indexedTimes)
    new_list = []
    for i in range(1,num_times):
        new_list.append((indexedTimes[i][1]-indexedTimes[i-1][1],datediff(indexedTimes[i][0]-indexedTimes[i-1][0])))
    return new_list

data                                                     # RDD[(userId, (timestep, index))]
  .groupByKey                                            # now RDD[(userId, list[(timestep, index)])]
  .flatMap(lambda userList: process(list(userList[1])))  # now RDD[(didx, dt)]
  .groupByKey                                            # now RDD[(didx, list(dt))]
  .collect                                               # get elements in final list instead of RDD

您好,非常感谢您的回答。一件小事,需要在.flatMap之后插入一个。我实现了这个,它运行了一点,但是它抛出了一个:TypeError:“ResultIterable”对象不支持索引。但是我找到了这个答案:但是我不知道如何使它适应indexedTimes元素。啊,是的,我明白了意思是,你可以在函数之前将ResultIterable对象类型转换为列表,它应该可以工作。我编辑了答案,几乎解决了它。我现在收到一个错误,因为我的时间无法减去。我用datediffindexedTimes[I][1],indexedTimes[I-1][1]替换了函数中的行但是我得到了一个:AttributeError:“非类型”对象没有属性“\u jvm”。我确信这是由于diff函数。日期是indexedTimes[I][0],而不是indexedTimes[I][1]。换句话说,您试图在索引上使用datediff,而不是日期。在函数中,日期索引被反转为索引差,日期差,因为您希望按索引差进行分组,因此此值需要在元组中的第一个。因此,请尝试将datediff移到indexedTimes[i][0]-indexedTimes[i-1][0]与indexedTimes[i][1]-indexedTimes[i-1][1]相反,我编辑了答案如果仍然出现相同的错误,请查看以下答案: