【问题标题】:How to use map to make rest api calls in pyspark如何使用map在pyspark中进行rest api调用
【发布时间】:2021-08-20 01:06:12
【问题描述】:

我正在尝试使用 map 对 rdd 进行 put rest api 调用,如下所示:

def put(params, payload):
  
  url = "https://{}/{}".format(server, params)
  headers = {
    'Content-Type': 'application/json' }
  
  response = requests.request("PUT", url, headers=headers, data = payload) 
  return response.status_code

df.select("params", "payload").rdd.map(lambda x, y: put(x, y)).collect()

但我收到一个错误:

org.apache.spark.api.python.PythonException: 'TypeError: () 缺少 1 个必需的位置参数:'payload''

似乎lambda函数没有得到第二个参数payload,不知道为什么。有谁能帮帮我吗?

【问题讨论】:

    标签: python apache-spark


    【解决方案1】:

    下面这段代码是罪魁祸首:

    df.select("params", "payload").rdd.map(lambda x, y: put(x, y)).collect()
    

    您不能在 lambda 函数中解压数据帧。这是正确的:

    df.select("params", "payload").rdd.map(lambda row: put(row[0], row[1])).collect()
    

    【讨论】:

    • 你碰巧知道如何将响应合并回 rdd 或 df 吗?我想将响应映射回每个请求(每行)。
    • 感谢您的回答。我尝试了很多次来支持你的答案,不知道发生了什么,堆栈溢出不会显示它。可能是一个错误?
    【解决方案2】:

    我无法对 Nihad 的回答添加评论。因此,为 Nihad 的答案添加一个答案,以及如何将响应合并回 DF 的后续问题。

    你可以做如下的事情

    df_new = df.select("params", "payload").rdd.map(lambda row: [row[0],
                                                                 row[1],
                                                                 put(row[0], row[1])]
                                                    )
                                           .toDF()
    

    这样您可以将原始数据链接到响应。

    【讨论】:

      【解决方案3】:

      为了向数据框添加响应,您必须使用 udf 注册 put 方法并在 withColumn 方法中将其用于数据框。

      from pyspark.sql.types import StringType
      from pyspark.sql.functions import udf
      
      putUdf = udf(put, StringType())
      
      df = df.withColumn("response", putUdf(df.params, df.payload))
      

      这将创建一个名为 response 的新列并在其中填充 put 输出。

      【讨论】:

      • 感谢您的回复。我确实尝试过使用UDF,但性能不是很好。运行 1 行大约需要 6 分钟(并且 1 行花费的时间与 100 行相同)。这就是为什么我试图探索其他路线。 RDD 上的 MAP 是我发现的。不知道为什么在 RDD 上使用 MAP 比在 DateFrame 上使用 UDF 快得多。您会提供更多见解吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2014-08-10
      • 2017-07-10
      • 2018-07-26
      • 1970-01-01
      相关资源
      最近更新 更多