我正在使用一个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'作为拐杖,并没有正确地做到这一点。
由于
答案 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函数