Scala 如何在Spark中分解数据帧的行?
我有一个Spark数据框,其中包含类似以下内容的数据:Scala 如何在Spark中分解数据帧的行?,scala,apache-spark,hive,apache-spark-sql,Scala,Apache Spark,Hive,Apache Spark Sql,我有一个Spark数据框,其中包含类似以下内容的数据: +----+---------------------+-------+----------+-------------+ | ID | Timestamp | Value | Interval | Consumption | +----+---------------------+-------+----------+-------------+ | 1 | 2012-05-02 12:30:00 | 550 |
+----+---------------------+-------+----------+-------------+
| ID | Timestamp | Value | Interval | Consumption |
+----+---------------------+-------+----------+-------------+
| 1 | 2012-05-02 12:30:00 | 550 | 1 | 5 |
| 1 | 2012-05-02 12:45:00 | 551 | 1 | 1 |
| 1 | 2012-05-02 13:00:00 | 554 | 1 | 3 |
| 1 | 2012-05-02 14:00:00 | 578 | 4 | 24 |
| 1 | 2012-05-02 14:15:00 | 578 | 1 | 0 |
| 1 | 2012-05-02 14:30:00 | 584 | 1 | 6 |
+----+---------------------+-------+----------+-------------+
+----+---------------------+-------+----------+-------------+------------+
| ID | Timestamp | Value | Interval | Consumption | Estimation |
+----+---------------------+-------+----------+-------------+------------+
| 1 | 2012-05-02 12:30:00 | 550 | 1 | 5 | ? |
| 1 | 2012-05-02 12:45:00 | 551 | 1 | 1 | ? |
| 1 | 2012-05-02 13:00:00 | 554 | 1 | 3 | ? |
| 1 | 2012-05-02 13:15:00 | 560 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:30:00 | 566 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:45:00 | 572 | 1 | 6 | 4 |
| 1 | 2012-05-02 14:00:00 | 578 | 1 | 6 | 4 |
| 1 | 2012-05-02 14:15:00 | 578 | 1 | 0 | ? |
| 1 | 2012-05-02 14:30:00 | 584 | 1 | 6 | ? |
+----+---------------------+-------+----------+-------------+------------+
我希望将其转化为如下内容:
+----+---------------------+-------+----------+-------------+
| ID | Timestamp | Value | Interval | Consumption |
+----+---------------------+-------+----------+-------------+
| 1 | 2012-05-02 12:30:00 | 550 | 1 | 5 |
| 1 | 2012-05-02 12:45:00 | 551 | 1 | 1 |
| 1 | 2012-05-02 13:00:00 | 554 | 1 | 3 |
| 1 | 2012-05-02 14:00:00 | 578 | 4 | 24 |
| 1 | 2012-05-02 14:15:00 | 578 | 1 | 0 |
| 1 | 2012-05-02 14:30:00 | 584 | 1 | 6 |
+----+---------------------+-------+----------+-------------+
+----+---------------------+-------+----------+-------------+------------+
| ID | Timestamp | Value | Interval | Consumption | Estimation |
+----+---------------------+-------+----------+-------------+------------+
| 1 | 2012-05-02 12:30:00 | 550 | 1 | 5 | ? |
| 1 | 2012-05-02 12:45:00 | 551 | 1 | 1 | ? |
| 1 | 2012-05-02 13:00:00 | 554 | 1 | 3 | ? |
| 1 | 2012-05-02 13:15:00 | 560 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:30:00 | 566 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:45:00 | 572 | 1 | 6 | 4 |
| 1 | 2012-05-02 14:00:00 | 578 | 1 | 6 | 4 |
| 1 | 2012-05-02 14:15:00 | 578 | 1 | 0 | ? |
| 1 | 2012-05-02 14:30:00 | 584 | 1 | 6 | ? |
+----+---------------------+-------+----------+-------------+------------+
更具体地说,我想谈谈:
+----+---------------------+-------+----------+-------------+
| ID | Timestamp | Value | Interval | Consumption |
+----+---------------------+-------+----------+-------------+
| 1 | 2012-05-02 14:00:00 | 578 | 4 | 24 |
+----+---------------------+-------+----------+-------------+
为此:
+----+---------------------+-------+----------+-------------+------------+
| ID | Timestamp | Value | Interval | Consumption | Estimation |
+----+---------------------+-------+----------+-------------+------------+
| 1 | 2012-05-02 13:15:00 | 560 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:30:00 | 566 | 1 | 6 | 4 |
| 1 | 2012-05-02 13:45:00 | 572 | 1 | 6 | 4 |
| 1 | 2012-05-02 14:00:00 | 578 | 1 | 6 | 4 |
+----+---------------------+-------+----------+-------------+------------+
我希望将间隔超过1的行从原始表中取出,为缺少的间隔插入值,并将新创建的行重新插入原始行的初始表位置。我知道如何实现这一点(例如,在PostgreSQL中,我只需使用generate_series()函数来创建所需的时间戳并计算新的值),但在Spark/Scala中实现这些是很麻烦的
假设我创建了一个新的数据帧,其中只包含间隔大于1的行,那么如何将这些行复制“n”次,而“n”是间隔的值?我相信这足以让我开始使用计数器函数,该函数由我可以创建的行引用分区
如果有一种方法可以复制我错过的generate_series()的行为,那就更好了。听起来
flatMap
是这项工作的合适工具,请参阅此处的详细信息:非常感谢您的建议,我现在就来看看。谢谢。真有趣——我忘了我已经回答了另一个问题。而且,我忘记了我知道如何通过使用join
和UDF
在join
右侧模拟爆炸
!!(记住对我的答案投赞成票!-)大卫,我一直在阅读文档并寻找例子。似乎大多数flatMap
、df.explode()
和LATERAL VIEW
的应用程序都有一个map
或UDF
,具有固定数量的输出。在我的例子中,我想将'Interval'的值n
转换成一个数组或列表,从1到n
,并将每个元素连接到相应的行,从而创建每行的n
副本。这样行吗?我正在努力研究如何实现这一点。听起来flatMap
是这项工作的合适工具,请参阅此处的详细信息:非常感谢您的建议,我现在就来看看。谢谢。真有趣——我忘了我已经回答了另一个问题。而且,我忘记了我知道如何通过使用join
和UDF
在join
右侧模拟爆炸
!!(记住对我的答案投赞成票!-)大卫,我一直在阅读文档并寻找例子。似乎大多数flatMap
、df.explode()
和LATERAL VIEW
的应用程序都有一个map
或UDF
,具有固定数量的输出。在我的例子中,我想将'Interval'的值n
转换成一个数组或列表,从1到n
,并将每个元素连接到相应的行,从而创建每行的n
副本。这样行吗?我正努力想知道如何做到这一点。