Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
如何使用Pyspark将flatmap与Dataframe中的多列一起使用_Pyspark_Pyspark Sql_Pyspark Dataframes - Fatal编程技术网

如何使用Pyspark将flatmap与Dataframe中的多列一起使用

如何使用Pyspark将flatmap与Dataframe中的多列一起使用,pyspark,pyspark-sql,pyspark-dataframes,Pyspark,Pyspark Sql,Pyspark Dataframes,我的DF如下所示: Name city starttime endtime user1 London 2019-08-02 03:34:45 2019-08-02 03:52:03 user2 Boston 2019-08-13 13:34:10 2019-08-13 15:02:10 我想检查endtime,如果它跨越到下一个小时,则使用当前小时的最后一分钟/秒更新当前记录,并附加另一行或多行类似数据,如下图所

我的DF如下所示:

Name    city       starttime               endtime
user1   London      2019-08-02 03:34:45   2019-08-02 03:52:03
user2   Boston      2019-08-13 13:34:10   2019-08-13 15:02:10
我想检查endtime,如果它跨越到下一个小时,则使用当前小时的最后一分钟/秒更新当前记录,并附加另一行或多行类似数据,如下图所示。我是使用flapmap还是将DF转换为RDD并使用map,还是另一种方法

Name    city     starttime               endtime
user1   London   2019-08-02 03:34:45   2019-08-02 03:52:03
user2   Boston   2019-08-13 13:34:10   2019-08-13 13:59:59
user2   Boston   2019-08-13 14:00:00   2019-08-13 14:59:59
user2   Boston   2019-08-13 15:00:00   2019-08-13 15:02:10

谢谢

检查此链接,问题在此处解决:谢谢。我还在学习expr、split、repeat和posexplode的用法。我将研究并尝试理解逻辑是如何构造的。好的,我运行了代码,它工作得很好。1使用exprsplit有什么意义。。。。。。。。。。。。它似乎没有增加任何价值。2在第1行,你为什么要投到小数点14,2?为什么不只是整数?只是想了解思考过程。@NetRocks是的,你可以将其转换为Int,实际上在我的第一个解决方案中,我检查了小数点后的微小差异,我更改了逻辑,但忘记了替换cast。我正在使用exprsplit。。。与array_repeat不同,array_repeat也可以在python中使用,但不能与动态计数一起使用,因此我使用了repeat,它提供简单的字符串,并使用split来获取列表,以便我们可以分解它。不能分解字符串:-
 >>> from pyspark.sql.functions  import *
 >>> df.show()
    +-----+------+-------------------+-------------------+
    | Name|  city|          starttime|            endtime|
    +-----+------+-------------------+-------------------+
    |user1|London|2019-08-02 03:34:45|2019-08-02 03:52:03|
    |user2|Boston|2019-08-13 13:34:10|2019-08-13 15:02:10|
    +-----+------+-------------------+-------------------+

>>> df1 = df.withColumn("diff", ((hour(col("endtime")) - hour(col("starttime")))).cast("Int"))
            .withColumn("loop", expr("split(repeat(':', diff),':')"))
            .select(col("*"), posexplode(col("loop")).alias("pos", "value"))
            .drop("value", "loop")

>>> df1.withColumn("starttime", when(col("pos") == 0, col("starttime")).otherwise(from_unixtime(unix_timestamp(col("starttime")) + (col("pos") * 3600) - minute(col("starttime"))*60 - second(col("starttime")))))
       .withColumn("endtime", when((col("diff") - col("pos")) == 0, col("endtime")).otherwise(from_unixtime(unix_timestamp(col("endtime")) - ((col("diff") - col("pos")) * 3600) - minute(col("endtime"))*60 - second(col("endtime")) + lit(59) * lit(60) + lit(59))))
       .drop("diff", "pos")
       .show()
    +-----+------+-------------------+-------------------+
    | Name|  city|          starttime|            endtime|
    +-----+------+-------------------+-------------------+
    |user1|London|2019-08-02 03:34:45|2019-08-02 03:52:03|
    |user2|Boston|2019-08-13 13:34:10|2019-08-13 13:59:59|
    |user2|Boston|2019-08-13 14:00:00|2019-08-13 14:59:59|
    |user2|Boston|2019-08-13 15:00:00|2019-08-13 15:02:10|
    +-----+------+-------------------+-------------------+