R 按时间戳+ID查找缺少的行

R 按时间戳+ID查找缺少的行,r,apache-spark,dplyr,sparklyr,R,Apache Spark,Dplyr,Sparklyr,我试图找到丢失的时间戳。这里有很多解决这个问题的方法。尽管如此,我还是希望找到ID的时间戳缺失的地方 例如,测试数据集如下所示: elemuid timestamp 1232 2018-02-10 23:00:00 1232 2018-02-10 23:01:00 1232 2018-02-10 22:58:00 1674 2018-02-10 22:40:00 1674 2018-02-10 22:39:00 1674 2018-02-10 22:37:00

我试图找到丢失的时间戳。这里有很多解决这个问题的方法。尽管如此,我还是希望找到ID的时间戳缺失的地方

例如,测试数据集如下所示:

elemuid timestamp
1232    2018-02-10 23:00:00
1232    2018-02-10 23:01:00
1232    2018-02-10 22:58:00
1674    2018-02-10 22:40:00
1674    2018-02-10 22:39:00
1674    2018-02-10 22:37:00
1674    2018-02-10 22:35:00
解决方案应该是:

elemuid timestamp
1232    2018-02-10 22:59:00
1674    2018-02-10 22:38:00
1674    2018-02-10 22:36:00
我的问题是我只能使用dplyr,因为我想在sparklyr中也使用这段代码。 我真的很高兴你的帮助

这里有一个带反_连接的选项。假设'timestamp'列不是Datetime对象,我们将其转换为POSIXct

这里有一个带反_连接的选项。假设'timestamp'列不是Datetime对象,我们将其转换为POSIXct


为了简单起见,假设您已经遵循了,并以秒为单位计算了min_max

其余步骤与我们之前遵循的步骤非常相似:

生成值的范围:

epoch_range <- spark_session(sc) %>% 
  invoke("range", as.integer(min_max[1]), as.integer(min_max[2]), 60L) %>%
  invoke("withColumnRenamed", "id", "timestamp")
现在,我们要生成一个参考表,作为范围和唯一ID的笛卡尔乘积:

ref <- epoch_range %>% 
  invoke("crossJoin", elemuids) %>% 
  sdf_register() %>%
  mutate(timestamp = from_unixtime(timestamp, "yyyy-MM-dd HH:mm:ss.SSS"))
在这种情况下,若产品的大小很小,Spark应该使用广播连接,那个么这将很好地工作,但在其他情况下会导致完整的数据倾斜,所以在一般情况下使用是不安全的

最后,我们将像前面一样对外连接数据:

ref %>% left_join(df, by = c("timestamp", "elemuid"))
要填写内容,或按照anti-join提供的方法删除缺失的点,请执行以下操作:

ref %>% anti_join(df, by = c("timestamp", "elemuid"))

为了简单起见,假设您已经遵循了,并以秒为单位计算了min_max

其余步骤与我们之前遵循的步骤非常相似:

生成值的范围:

epoch_range <- spark_session(sc) %>% 
  invoke("range", as.integer(min_max[1]), as.integer(min_max[2]), 60L) %>%
  invoke("withColumnRenamed", "id", "timestamp")
现在,我们要生成一个参考表,作为范围和唯一ID的笛卡尔乘积:

ref <- epoch_range %>% 
  invoke("crossJoin", elemuids) %>% 
  sdf_register() %>%
  mutate(timestamp = from_unixtime(timestamp, "yyyy-MM-dd HH:mm:ss.SSS"))
在这种情况下,若产品的大小很小,Spark应该使用广播连接,那个么这将很好地工作,但在其他情况下会导致完整的数据倾斜,所以在一般情况下使用是不安全的

最后,我们将像前面一样对外连接数据:

ref %>% left_join(df, by = c("timestamp", "elemuid"))
要填写内容,或按照anti-join提供的方法删除缺失的点,请执行以下操作:

ref %>% anti_join(df, by = c("timestamp", "elemuid"))

这是一个简单直观的答案。正如我提到的,我的问题是我只能使用dplyr。Sparkyr不支持ymd_hms和complete函数。几天前我问了一个类似的问题:。现在我不知道如何更改答案,以用ID完全填充我的任务。@luks_wi将基于R函数,如expand.grid和as.POSIXct work?i、 e.df1%变异平均值=as。POSIXcttimestamp@luks_wi我认为这些功能会起作用,因为它们是tidyverse@akrun真奇怪。spark\u sessionsc%>%invokerage,as.integermin\u max[1],as.integermin\u max[2]]>%sdf\u寄存器如何,其中sc是spark\u连接对象?听起来像。关于这个问题-要使它在Spark中工作,您需要使用具有不同ID的跨产品,但您必须确保使用SQL,而不是使用dummy的dplyr方法,否则最终将使用单个分区,因此可能更容易一直使用SQL编写。这是一个简单直观的答案。正如我提到的,我的问题是我只能使用dplyr。Sparkyr不支持ymd_hms和complete函数。几天前我问了一个类似的问题:。现在我不知道如何更改答案,以用ID完全填充我的任务。@luks_wi将基于R函数,如expand.grid和as.POSIXct work?i、 e.df1%变异平均值=as。POSIXcttimestamp@luks_wi我认为这些功能会起作用,因为它们是tidyverse@akrun真奇怪。spark\u sessionsc%>%invokerage,as.integermin\u max[1],as.integermin\u max[2]]>%sdf\u寄存器如何,其中sc是spark\u连接对象?听起来像。关于这个问题-要使它在Spark中工作,您需要使用具有不同ID的跨积,但您必须确保使用SQL来完成,而不是使用dummy的dplyr方式,否则最终将使用单个分区,因此可能更容易一直使用SQL编写。啊……太好了!这就是我一直在寻找的。同时,我试着用spark_apply扩展SparkyR功能,但不幸的是,它并没有那么好地工作。我得到的只是一个状态为255的错误。尽管如此,我还是非常感谢你的帮助!为什么这个方法不能处理数百万行?ref数据集看起来不错,但每个ID的日期计数与join后相同..?可能没有缺少的值。一般来说,尽量将问题归结为MCVE。例如,当你取一个小样本时会发生这种情况吗?但是如果反连接表和ref表一样大,这意味着所有的日期都丢失了,这是不可能的。我会在有空闲的时候尝试一下,看看我是否能以某种方式重现这种情况。你用哪种版本的Spark?啊…太好了!这就是我一直在寻找的。同时,我试着用spark_apply扩展SparkyR功能,但不幸的是,它并没有那么好地工作。我得到的只是一个状态为255的错误。尽管如此,我还是非常感谢你的帮助!为什么这个方法不能处理数百万行?ref数据集看起来不错
,但每个ID的日期计数与join…后相同?可能没有缺少的值。一般来说,尽量将问题归结为MCVE。例如,当你取一个小样本时会发生这种情况吗?但是如果反连接表和ref表一样大,这意味着所有的日期都丢失了,这是不可能的。我会在有空闲的时候尝试一下,看看我是否能以某种方式重现这种情况。您使用哪种版本的Spark?