【发布时间】:2020-07-24 23:28:28
【问题描述】:
我想在 spark 数据框和 hive 表中聚合列值 (json)。
例如
year, month, val (json)
2010 01 [{"a_id":"caes"},{"a_id":"rgvtsa"},{"a_id":"btbsdv"}]
2010 01 [{"a_id":"caes"},{"a_id":"uktf"},{"a_id":"ohcwa"}]
2008 10 [{"a_id":"rfve"},{"a_id":"yjndf"},{"a_id":"onbds"}]
2008 10 [{"a_id":"fvds"},{"a_id":"yjndf"},{"a_id":"yesva"}]
我需要:
year, month, val (json), num (int)
2010 01 [{"a_id":"caes"},{"a_id":"rgvtsa"},{"a_id":"btbsdv},{"a_id":"uktf"}, {"a_id":"ohcwa"}] 5
2008 10 [{"a_id":"rfve"},{"a_id":"yjndf"},{"a_id":"onbds"},{"a_id":"yesva"}] 4
我需要删除重复项并在其中找到 json 字符串的大小(“a_id”的数量)。
数据保存为 hive 表,因此最好通过 pyspark sql 处理它?
如果将其保存为 spark 数据框,我也想知道如何处理它。
我试过了:
from pyspark.sql.functions import from_json, col
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType(
[
StructField('a_id', StringType(), True)
]
)
df.withColumn("val", from_json("val", schema))\
.select(col('year'), col('month'), col('val.*'))\
.show()
但是,“val1”中的所有值都是空的。
谢谢
UPDTAE 我的蜂巢版本:
%sh
ls /databricks/hive | grep "hive"
spark--maven-trees--spark_1.4_hive_0.13
我的 DDL:
import pyspark.sql.functions as F
import pyspark.sql.types as T
from pyspark.sql.types import *
def concate_elements(val):
return reduce (lambda x, y:x+y, val)
flatten_array = F.udf(concate_elements, T.ArrayType(T.StringType()))
remove_duplicates = udf(lambda row: list(set(row)),
ArrayType(StringType()))
#final results
df.select("year","month", flatten_array("val").alias("flattenvalues")).withColumn("uniquevalues", remove_duplicates("flattenvalues")).withColumn("size",F.size("uniquevalues")).show()
【问题讨论】:
-
我从一串 json 文件中读取它并更新了我的答案,如果您想在 val 列中有一个特定的 JSON,请更新您的问题以读取数据(来自 hive 或其他一些来源),因为我已尽力使用 JSON/非 JSON 列创建 DF,但短时间内无法创建,如果提供的答案无法解决您的场景,那么将寻找更多选项来解决您的问题。
-
为您的方案更新了答案 -> 从 spark 中的 hive 读取数据
-
不要频繁更改您的问题,而是提出一个新问题??
标签: sql json dataframe pyspark