簡體   English   中英

將列添加到數據框並在pyspark中更新

[英]Adding column to dataframe and updating in pyspark

我在pyspark中有一個數據框:

ratings = spark.createDataFrame(
    sc.textFile("transactions.json").map(lambda l: json.loads(l)),
)
ratings.show()

+--------+-------------------+------------+----------+-------------+-------+
|click_id|         created_at|          ip|product_id|product_price|user_id|
+--------+-------------------+------------+----------+-------------+-------+
|     123|2016-10-03 12:50:33| 10.10.10.10|     98373|        220.5|      1|
|     124|2017-02-03 11:51:33| 10.13.10.10|     97373|        320.5|      1|
|     125|2017-10-03 12:52:33| 192.168.2.1|     96373|         20.5|      1|
|     126|2017-10-03 13:50:33|172.16.11.10|     88373|        220.5|      2|
|     127|2017-10-03 13:51:33| 10.12.15.15|     87373|        320.5|      2|
|     128|2017-10-03 13:52:33|192.168.1.10|     86373|         20.5|      2|
|     129|2017-08-03 14:50:33| 10.13.10.10|     78373|        220.5|      3|
|     130|2017-10-03 14:51:33| 12.168.1.60|     77373|        320.5|      3|
|     131|2017-10-03 14:52:33| 10.10.30.30|     76373|         20.5|      3|
+--------+-------------------+------------+----------+-------------+-------+

ratings.registerTempTable("transactions")
final_df = sqlContext.sql("select * from transactions");

我想向此數據框添加一個名為status的新列,然后基於created_atuser_id更新status列。

created_atuser_id被從給定的表中讀出transations並傳遞到功能get_status(user_id,created_at)它返回status status需要作為對應的user_idcreated_at的新列放入交易表中

我可以在pyspark中運行alter and update命令嗎? 如何使用pyspark完成?

目前尚不清楚您想做什么。 您應該查看window functions它們使您可以比較,求和...在一幀中的行。

例如

import pyspark.sql.functions as psf
from pyspark.sql import Window
w = Window.partitionBy("user_id").orderBy(psf.desc("created_at"))
ratings.withColumn(
    "status", 
    psf.when(psf.row_number().over(w) == 1, "active").otherwise("inactive")).sort("click_id").show()

+--------+-------------------+------------+----------+-------------+-------+--------+
|click_id|         created_at|          ip|product_id|product_price|user_id|  status|
+--------+-------------------+------------+----------+-------------+-------+--------+
|     123|2016-10-03 12:50:33| 10.10.10.10|     98373|        220.5|      1|inactive|
|     124|2017-02-03 11:51:33| 10.13.10.10|     97373|        320.5|      1|inactive|
|     125|2017-10-03 12:52:33| 192.168.2.1|     96373|         20.5|      1|  active|
|     126|2017-10-03 13:50:33|172.16.11.10|     88373|        220.5|      2|inactive|
|     127|2017-10-03 13:51:33| 10.12.15.15|     87373|        320.5|      2|inactive|
|     128|2017-10-03 13:52:33|192.168.1.10|     86373|         20.5|      2|  active|
|     129|2017-08-03 14:50:33| 10.13.10.10|     78373|        220.5|      3|inactive|
|     130|2017-10-03 14:51:33| 12.168.1.60|     77373|        320.5|      3|inactive|
|     131|2017-10-03 14:52:33| 10.10.30.30|     76373|         20.5|      3|  active|
+--------+-------------------+------------+----------+-------------+-------+--------+

它為您提供了每個用戶的最終點擊

如果要傳遞UDF以從兩個現有列中創建一個新列。 假設您有一個將user_idcreated_at作為參數的函數

from pyspark.sql.types import *
def get_status(user_id,created_at): 
    ...

get_status_udf = psf.udf(get_status, StringType())

StringType()或函數輸出的任何數據類型

ratings.withColumn("status", get_status_udf("user_id", "created_at"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM