使用请求模块并将响应返回给Pyspark Dataframe

时间:2018-03-18 23:07:39

标签: python apache-spark dataframe pyspark python-requests

我正在使用一个API来发送带有两个键:值对的JSON响应。我目前正在通过点击API 2不同时间并使用withColumn将每个键:值对保存到列中而不是一次性地保存API并同时保存两个键:值对来保存对我的数据帧的响应。有没有人有关于如何正确做到这一点的指导?

我的数据框是一列,其中包含我发送给API的值:

{response:
FirstDataPoint: "SomethingSomething"
SecondDataPoint: "SomethingSomething"}

JSON回复:

def FirstVariableCode(businessId):
  response = api.query(id=businessId)
  x = response['FirstVariable'].encode('utf-8').strip()
  return x


def SecondVariableCode(businessId):
  response = api.query(id=businessId)
  y = response['SecondVariable'].encode('utf-8').strip()
  return y

FirstVariableCode = udf(FirstVariableCode, StringType())
SecondVariableCode = udf(SecondVariableCode, StringType())

df.withColumn('FirstVariable', FirstVariableCode(df.businessId))
df.withColumn('SecondVariable', SecondVariableCode(df.businessId))

我的代码(调用API两次以解析一个响应):

id

如何点击API并将两个值正确保存到各自的列?我觉得我正在使用'withColumn'作为拐杖,并没有正确地做到这一点。

由于

1 个答案:

答案 0 :(得分:2)

您可以将udf个函数合并为一个

def variableCodes(businessId):
    response = api.query(id=businessId)
    x = response['FirstVariable'].encode('utf-8').strip()
    y = response['SecondVariable'].encode('utf-8').strip()
    return (x, y)

from pyspark.sql import functions as F
from pyspark.sql import types as T
variableCodeUdf = F.udf(variableCodes, T.StructType([T.StructField("FirstVariable", T.StringType()), T.StructField('SecondVariable', T.StringType())]))

然后调用udf函数一次并使用* 将通过调用udf函数创建的struct列扩展为单独的列

df.withColumn('variables', variableCodeUdf(df.businessId))\
    .select(F.col('businessId'), F.col('variables.*'))\
    .show(truncate=False)

这应该给你dataframe类似下面的内容

+----------+-------------+--------------+
|businessId|FirstVariable|SecondVariable|
+----------+-------------+--------------+
|dksldfaw2 |x value1     |y1            |
|kkldsdok3 |x2           |y2            |
|djdfkdfk3 |x3           |y3            |
+----------+-------------+--------------+

我希望答案很有帮助

注意:尝试尽可能使用内置函数而不是udf函数