连接两个数据框:丢失的任务

时间:2018-11-08 13:10:02

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我在PySpark DataFrame中有时间序列数据。我的每个信号(value列)都应分配一个唯一的id。但是id的值是不精确的,需要扩展到两端。原始的DataFrame看起来像这样:

df_start
+------+----+-------+
| time | id | value |
+------+----+-------+
|     1|   0|    1.0|
|     2|   1|    2.0|
|     3|   1|    2.0|
|     4|   0|    1.0|
|     5|   0|    0.0|
|     6|   0|    1.0|
|     7|   2|    2.0|
|     8|   2|    3.0|
|     9|   2|    2.0|
|    10|   0|    1.0|
|    11|   0|    0.0|
+------+----+-------+

所需的输出是:

df_desired
+------+----+-------+
| time | id | value |
+------+----+-------+
|     1|   1|    1.0|
|     2|   1|    2.0|
|     3|   1|    2.0|
|     4|   1|    1.0|
|     6|   2|    1.0|
|     7|   2|    2.0|
|     8|   2|    3.0|
|     9|   2|    2.0|
|    10|   2|    1.0|
|    11|   2|    1.0|
+------+----+-------+

所以这里发生了两件事:

  • id列不够精确:每个id开始记录a(此处为1和1)的时间步长,并记录b时间(此处为1)。和2)尽早。因此,我必须用各自的ID替换一些零。
  • 在“填充” id列中的条目之后,我用id=0删除了所有剩余的行。 (仅适用于带有time=5的行。)

幸运的是,我知道每个ID的相对记录时间延迟是多少。目前,我将其转换为绝对正确的记录时间

df_join
+----+-------+-------+
| id | min_t | max_t |
+----+-------+-------+
|   1|      1|      4|
|   2|      6|     11|
+----+-------+-------+

我用来通过联接“过滤”原始数据

df_desired = df_join.join(df_start, 
                          df_start.time.between(df_join.min_t, df_join.max_t)
                         )

这将产生所需的输出。

实际上df_join至少有40万行,df_start大约有100亿行,其中我们最多。

在集群上运行此命令时,有时会收到诸如Lost task, ExecutorLostFailure, Container marked as failed, Exit code: 134之类的警告。

我怀疑执行器的内存不足,但是我没有找到任何解决方案。

0 个答案:

没有答案