Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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
Python Pyspark:如何遍历数据帧列?_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python Pyspark:如何遍历数据帧列?

Python Pyspark:如何遍历数据帧列?,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我是Pypark的新手。我通常和熊猫一起工作。我希望使用pyspark中的列逐行迭代。我的数据集看起来像:- +-------------------+--------------------+--------+-----+ | DateTime| user_name|keyboard|mouse| +-------------------+--------------------+--------+-----+ |2019-10-21 08:35:01|

我是Pypark的新手。我通常和熊猫一起工作。我希望使用pyspark中的列逐行迭代。我的数据集看起来像:-

+-------------------+--------------------+--------+-----+
|           DateTime|           user_name|keyboard|mouse|
+-------------------+--------------------+--------+-----+
|2019-10-21 08:35:01|prathameshsalap@g...|   333.0|658.0|
|2019-10-21 08:35:01|vaishusawant143@g...|   447.5|  0.0|
|2019-10-21 08:35:01|     you@example.com|     0.5|  1.0|
|2019-10-21 08:40:01|     you@example.com|     0.0|  0.0|
|2019-10-21 08:40:01|prathameshsalap@g...|   227.0|366.0|
|2019-10-21 08:40:02|vaishusawant143@g...|   472.0|  0.0|
|2019-10-21 08:45:01|     you@example.com|     0.0|  0.0|
|2019-10-21 08:45:01|prathameshsalap@g...|    35.0|458.0|
|2019-10-21 08:45:01|vaishusawant143@g...|  1659.5|  0.0|
|2019-10-21 08:50:01|     you@example.com|     0.0|  0.0|
+-------------------+--------------------+--------+-----+
在熊猫数据框中,它也有一个给定的索引,但在spark中没有。 大熊猫:-

## pandas
usr_log = pd.read_csv("data.csv")
unique_users = usr_log.user_name.unique()
usr_log.sort_values(by='DateTime', inplace=True)
users_new_data = dict()
users_new_data[user] = {'start_time': None}

for user in unique_users:
    count_idle = 0
    ## first part of the question
    for index in usr_log.index:
        if user == usr_log['user_name'][index]:
            if users_new_data[user]['start_time'] is None:
                users_new_data[user]['start_time'] = usr_log['DateTime'][index]

            ## Second part of the question

            if usr_log['keyboard'][index] == 0 and usr_log['mouse'][index] == 0:
                count_idle += 1
            else:
                count_idle = 0
            if count_idle >= 5:
                if count_idle == 5:
                    users_new_data[usr_log['user_name'][index]]['idle_time'] \
                        = users_new_data[usr_log['user_name'][index]].get('idle_time') \
                          + datetime.timedelta(0, 1500)
                else:
                    users_new_data[usr_log['user_name'][index]]['idle_time'] \
                        = users_new_data[usr_log['user_name'][index]].get('idle_time') \
                          + datetime.timedelta(0, 300)
同样的事情怎么能在spark中做到呢

对于5分钟后生成的每个用户数据(例如,如果用户在8:30:01开始,则在8:35:01生成下一个日志)。在中的第二个问题中,我想为每个用户找到一个空闲时间。空闲时间的计算方法是,如果他在接下来的30分钟(1500)内不移动鼠标或不使用键盘,那么我就加上用户空闲时间

将字典值转换为数据帧后,我的预期输出如下:-

+--------------------+-------------------+-------------------+
|           user_name|         start_time|          idle_time|
+--------------------+-------------------+-------------------+
|prathameshsalap@g...|2019-10-21 08:35:01|2019-10-21 05:05:00|
|vaishusawant143@g...|2019-10-21 08:35:01|2019-10-21 02:15:00|
|     you@example.com|2019-10-21 08:35:01|2019-10-21 01:30:00|
+--------------------+-------------------+-------------------+

您应该按照以下示例进行操作:

  • df.withColumn(“用户名”,“做某事”

做某事”可以是您定义的任何函数。

您应该按照以下示例执行:

  • df.withColumn(“用户名”,“做某事”

do_something”可以是您定义的任何函数。

如果您想为每个用户找到他们拥有的第一个时间戳,您可以先在pandas中将其简化,请执行以下操作:

usr_log[['user_name','DateTime']].groupby(['user_name']).min()
对于spark来说,情况将非常相似

urs_log = sparkSession.read.csv(...)
urs_log.groupBy("user_name").agg(min("DateTime"))
您只需将
DateTime
列重命名为所需的列,并尝试不使用


在spark中,您有一个分布式集合,不可能执行for循环,您必须对列应用转换,决不能对一行数据应用逻辑。

如果您想为每个用户找到他们拥有的第一个时间戳,您可以先在pandas中简化它,请执行以下操作:

usr_log[['user_name','DateTime']].groupby(['user_name']).min()
对于spark来说,情况将非常相似

urs_log = sparkSession.read.csv(...)
urs_log.groupBy("user_name").agg(min("DateTime"))
您只需将
DateTime
列重命名为所需的列,并尝试不使用


在spark中,您有一个分布式集合,不可能执行for循环,您必须对列应用转换,决不能对一行数据应用逻辑。

这里有相同的解决方案

dataFrame = (spark.read.format("csv").option("sep", ",").option("header", "true").load("data.csv"))

df.show()
+-------------------+--------------------+--------+-----+
|           DateTime|           user_name|keyboard|mouse|
+-------------------+--------------------+--------+-----+
|2019-10-21 08:35:01|prathameshsalap@g...|   333.0|658.0|
|2019-10-21 08:35:01|vaishusawant143@g...|   447.5|  0.0|
|2019-10-21 08:35:01|     you@example.com|     0.5|  1.0|
|2019-10-21 08:40:01|prathameshsalap@g...|   227.0|366.0|
|2019-10-21 08:40:02|vaishusawant143@g...|   472.0|  0.0|
|2019-10-21 08:45:01|     you@example.com|     0.0|  0.0|
|2019-10-21 08:45:01|prathameshsalap@g...|    35.0|458.0|
|2019-10-21 08:45:01|vaishusawant143@g...|  1659.5|  0.0|
|2019-10-21 08:50:01|     you@example.com|     0.0|  0.0|
+-------------------+--------------------+--------+-----+
df1 = df.groupBy("user_name").agg(min("DateTime"))
df1.show()
+--------------------+-------------------+
|           user_name|      min(DateTime)|
+--------------------+-------------------+
|prathameshsalap@g...|2019-10-21 08:35:01|
|vaishusawant143@g...|2019-10-21 08:35:01|
|     you@example.com|2019-10-21 08:35:01|
+--------------------+-------------------+
其他部分—

df1 = df.withColumn("count",when(((col("keyboard")==0.0) & (col("mouse")==0.0)), count_idle+1).otherwise(0))

df2 = df1.withColumn("Idle_Sec",when((col("count")==0), 300).otherwise(1500))

df2.show()
+-------------------+--------------------+--------+-----+-----+--------+
|           DateTime|           user_name|keyboard|mouse|count|Idle_Sec|
+-------------------+--------------------+--------+-----+-----+--------+
|2019-10-21 08:35:01|prathameshsalap@g...|   333.0|658.0|    0|     300|
|2019-10-21 08:35:01|vaishusawant143@g...|   447.5|  0.0|    0|     300|
|2019-10-21 08:35:01|     you@example.com|     0.5|  1.0|    0|     300|
|2019-10-21 08:40:01|     you@example.com|     0.0|  0.0|    1|    1500|
|2019-10-21 08:40:01|prathameshsalap@g...|   227.0|366.0|    0|     300|
|2019-10-21 08:40:02|vaishusawant143@g...|   472.0|  0.0|    0|     300|
|2019-10-21 08:45:01|     you@example.com|     0.0|  0.0|    1|    1500|
|2019-10-21 08:45:01|prathameshsalap@g...|    35.0|458.0|    0|     300|
|2019-10-21 08:45:01|vaishusawant143@g...|  1659.5|  0.0|    0|     300|
|2019-10-21 08:50:01|     you@example.com|     0.0|  0.0|    1|    1500|
+-------------------+--------------------+--------+-----+-----+--------+

df3 = df2.groupBy("user_name").agg(min("DateTime").alias("start_time"),sum("Idle_Sec").alias("Sum_Idle_Sec"))

+--------------------+-------------------+------------+
|           user_name|         start_time|Sum_Idle_Sec|
+--------------------+-------------------+------------+
|prathameshsalap@g...|2019-10-21 08:35:01|         900|
|vaishusawant143@g...|2019-10-21 08:35:01|         900|
|     you@example.com|2019-10-21 08:35:01|        4800|
+--------------------+-------------------+------------+

df3.withColumn("Idle_time",(F.unix_timestamp("start_time") + col("Sum_Idle_Sec")).cast('timestamp')).show()
+--------------------+-------------------+---------+----------------------+
|           user_name|         start_time|Sum_Idle_Sec|          Idle_time|
+--------------------+-------------------+---------+----------------------+
|prathameshsalap@g...|2019-10-21 08:35:01|         900|2019-10-21 08:50:01|
|vaishusawant143@g...|2019-10-21 08:35:01|         900|2019-10-21 08:50:01|
|     you@example.com|2019-10-21 08:35:01|        4800|2019-10-21 09:55:01|
+--------------------+-------------------+---------+----------------------+

这是同样的解决方案

dataFrame = (spark.read.format("csv").option("sep", ",").option("header", "true").load("data.csv"))

df.show()
+-------------------+--------------------+--------+-----+
|           DateTime|           user_name|keyboard|mouse|
+-------------------+--------------------+--------+-----+
|2019-10-21 08:35:01|prathameshsalap@g...|   333.0|658.0|
|2019-10-21 08:35:01|vaishusawant143@g...|   447.5|  0.0|
|2019-10-21 08:35:01|     you@example.com|     0.5|  1.0|
|2019-10-21 08:40:01|prathameshsalap@g...|   227.0|366.0|
|2019-10-21 08:40:02|vaishusawant143@g...|   472.0|  0.0|
|2019-10-21 08:45:01|     you@example.com|     0.0|  0.0|
|2019-10-21 08:45:01|prathameshsalap@g...|    35.0|458.0|
|2019-10-21 08:45:01|vaishusawant143@g...|  1659.5|  0.0|
|2019-10-21 08:50:01|     you@example.com|     0.0|  0.0|
+-------------------+--------------------+--------+-----+
df1 = df.groupBy("user_name").agg(min("DateTime"))
df1.show()
+--------------------+-------------------+
|           user_name|      min(DateTime)|
+--------------------+-------------------+
|prathameshsalap@g...|2019-10-21 08:35:01|
|vaishusawant143@g...|2019-10-21 08:35:01|
|     you@example.com|2019-10-21 08:35:01|
+--------------------+-------------------+
其他部分—

df1 = df.withColumn("count",when(((col("keyboard")==0.0) & (col("mouse")==0.0)), count_idle+1).otherwise(0))

df2 = df1.withColumn("Idle_Sec",when((col("count")==0), 300).otherwise(1500))

df2.show()
+-------------------+--------------------+--------+-----+-----+--------+
|           DateTime|           user_name|keyboard|mouse|count|Idle_Sec|
+-------------------+--------------------+--------+-----+-----+--------+
|2019-10-21 08:35:01|prathameshsalap@g...|   333.0|658.0|    0|     300|
|2019-10-21 08:35:01|vaishusawant143@g...|   447.5|  0.0|    0|     300|
|2019-10-21 08:35:01|     you@example.com|     0.5|  1.0|    0|     300|
|2019-10-21 08:40:01|     you@example.com|     0.0|  0.0|    1|    1500|
|2019-10-21 08:40:01|prathameshsalap@g...|   227.0|366.0|    0|     300|
|2019-10-21 08:40:02|vaishusawant143@g...|   472.0|  0.0|    0|     300|
|2019-10-21 08:45:01|     you@example.com|     0.0|  0.0|    1|    1500|
|2019-10-21 08:45:01|prathameshsalap@g...|    35.0|458.0|    0|     300|
|2019-10-21 08:45:01|vaishusawant143@g...|  1659.5|  0.0|    0|     300|
|2019-10-21 08:50:01|     you@example.com|     0.0|  0.0|    1|    1500|
+-------------------+--------------------+--------+-----+-----+--------+

df3 = df2.groupBy("user_name").agg(min("DateTime").alias("start_time"),sum("Idle_Sec").alias("Sum_Idle_Sec"))

+--------------------+-------------------+------------+
|           user_name|         start_time|Sum_Idle_Sec|
+--------------------+-------------------+------------+
|prathameshsalap@g...|2019-10-21 08:35:01|         900|
|vaishusawant143@g...|2019-10-21 08:35:01|         900|
|     you@example.com|2019-10-21 08:35:01|        4800|
+--------------------+-------------------+------------+

df3.withColumn("Idle_time",(F.unix_timestamp("start_time") + col("Sum_Idle_Sec")).cast('timestamp')).show()
+--------------------+-------------------+---------+----------------------+
|           user_name|         start_time|Sum_Idle_Sec|          Idle_time|
+--------------------+-------------------+---------+----------------------+
|prathameshsalap@g...|2019-10-21 08:35:01|         900|2019-10-21 08:50:01|
|vaishusawant143@g...|2019-10-21 08:35:01|         900|2019-10-21 08:50:01|
|     you@example.com|2019-10-21 08:35:01|        4800|2019-10-21 09:55:01|
+--------------------+-------------------+---------+----------------------+


你能发布你的预期输出吗?你能再检查一下吗@Ajaykharade在这里感到困惑,我无法提供相关的输入和输出数据集?您不了解的内容请澄清我?在这里,在按日期时间排序之后,如果开始时间为None,我会找到每个用户的开始时间。我希望你明白了@AjayKharadeNow,我能把输入和输出联系起来,谢谢。我已经发布了相同的解决方案。您可以发布您的预期输出吗?您可以再次检查吗@Ajaykharade在这里感到困惑,我无法提供相关的输入和输出数据集?您不了解的内容请澄清我?在这里,在按日期时间排序之后,如果开始时间为None,我会找到每个用户的开始时间。我希望你明白了@AjayKharadeNow,我能把输入和输出联系起来,谢谢。我已经发布了相同的解决方案。我只想使用spark数据框。因此,当我创建一个新的do_something()函数来迭代如何使用spark时,我只想使用spark数据帧。所以当我创建一个新的do_something()函数来迭代如何使用spark时,谢谢你的帮助。我还有一个问题。我可以在这里寄信吗?与此问题相关的问题相同。@AlfilercioI在此处又添加了一个问题,请再次检查@阿尔菲勒感谢你帮助我。我还有一个问题。我可以在这里寄信吗?与此问题相关的问题相同。@AlfilercioI在此处又添加了一个问题,请再次检查@阿尔菲勒感谢你帮助我@Ajay Kharede。我还有一个和这个话题相关的问题。你们可以问下一件事,但若上下文不同,那个么最好把下一个问题放在上面。请再次检查。再次感谢。@Ajay Kharadon不确定,我无法匹配您的输出,也找不到匹配的逻辑,我编辑了答案,是您正在查找的内容吗?抱歉,您没有理解我的意思。这里我想计算每个用户的空闲时间。如果任何用户不移动鼠标或不使用键盘,则继续30分钟。然后在空闲时间内增加30分钟。像任何用户时间10:30:45到11:06:00一样,不要移动鼠标或使用键盘,然后我想添加35:15(35分钟15秒)(2019-10-21 00:35:15)@Ajay Kharade谢谢你帮助我@Ajay Kharede。我还有一个和这个话题相关的问题。你们可以问下一件事,但若上下文不同,那个么最好把下一个问题放在上面。请再次检查。再次感谢。@Ajay Kharadon不确定,我无法匹配您的输出,也找不到匹配的逻辑,我编辑了答案,是您正在查找的内容吗?抱歉,您没有理解我的意思。这里我想计算每个用户的空闲时间。如果任何用户不移动鼠标或不使用键盘,则继续30分钟。然后在空闲时间内增加30分钟。像任何用户时间10:30:45到11:06:00一样,不要移动鼠标或使用键盘,然后我想添加35:15(35分钟15秒)(2019-10-21 00:35:15)@阿杰哈拉德