我有一个Spark (在Palantir铸造)与列"c_temperature“。该列在每一行中都包含一个JSON字符串,其模式如下:
{"TempCelsiusEndAvg":"24.33","TempCelsiusEndMax":"null","TempCelsiusEndMin":"null","TempCelsiusStartAvg":"22.54","TempCelsiusStartMax":"null","TempCelsiusStartMin":"null","TempEndPlausibility":"T_PLAUSIBLE","TempStartPlausibility":"T_PLAUSIBLE"}我尝试用以下代码提取新列"TempCelsiusEndAvg“和"TempCelsiusStartAvg”中的avg温度值(有时为"null“,有时为"24.33"):
from pyspark.sql import functions as F
from pyspark.sql.types import StringType
def flat_json(sessions_finished):
df = sessions_finished
df = df.withColumn("new_temperature", F.col('c_temperature').cast(StringType())
df = df.withColumn("TempCelsiusEndAvg", F.get_json_object("c_Temperature", '$.TempCelsiusEndAvg'))
df = df.withColumn("TempCelsiusStartAvg", F.get_json_object("c_Temperature", '$.TempCelsiusStartAvg'))
return df我想让新的专栏充满双打,比如:
... +-----------------+-------------------+ ...
... |TempCelsiusEndAvg|TempCelsiusStartAvg| ...
... +-----------------+-------------------+ ...
... | 24.33| 22.54| ...
... +-----------------+-------------------+ ...
... | 29.28| 25.16| ...
... +-----------------+-------------------+ ...
... | null| null| ...
... +-----------------+-------------------+ ...新的dataframe包含列,但它们只填充空值。有人能帮我解决这个问题吗?
... +-----------------+-------------------+ ...
... |TempCelsiusEndAvg|TempCelsiusStartAvg| ...
... +-----------------+-------------------+ ...
... | null| null| ...
... +-----------------+-------------------+ ...
... | null| null| ...
... +-----------------+-------------------+ ...
... | null| null| ...
... +-----------------+-------------------+ ...在这个线程中也有一个注释: https://stackoverflow.com/questions/46084158/how-can-you-parse-a-string-that-is-json-from-an-existing-temp-table-using-pyspar,它描述了我的问题,但是我不知道如何使用这些信息。
发布于 2022-11-16 11:07:10
您不需要做任何事情,因为列已经是一个结构。您可以通过使用.访问这些列来创建它们。
df = df.withColumn("TempCelsiusEndAvg", F.col("c_temperature.TempCelsiusEndAvg"))
df = df.withColumn("TempCelsiusStartAvg", F.col("c_temperature.TempCelsiusStartAvg"))https://stackoverflow.com/questions/74457628
复制相似问题