Apache spark 在pyspark数据帧中的结构类型列中查找文本wirhin

Apache spark 在pyspark数据帧中的结构类型列中查找文本wirhin,apache-spark,pyspark,Apache Spark,Pyspark,我想在dataframe的struct type列中查找“matches_count”文本的出现次数。我如何在pyspark中实现这一点。我需要返回一个包含计数的列。此外,每行的结构都不同,因此行中可能存在也可能不存在相同的键 "abcviolation": { "2020.06.01.xls": { "twnin": { "matches_count": 1

我想在dataframe的struct type列中查找“matches_count”文本的出现次数。我如何在pyspark中实现这一点。我需要返回一个包含计数的列。此外,每行的结构都不同,因此行中可能存在也可能不存在相同的键

"abcviolation": {
                "2020.06.01.xls": {
                    "twnin": {
                        "matches_count": 1
                    },
                    "phtaxid": {
                        "matches_count": 30
                    },
                    "driverslicense": {
                        "matches_count": 15
                    },
                    "DICard_Term": {
                        "matches_count": 1
                    },
                    "resident": {
                        "matches_count": 30
                    },
                    "win": {
                        "matches_count": 30
                    },
                    "port2": {
                        "matches_count": 1
                    },
                    "id_2": {
                        "matches_count": 30
                    },
                    "id_3": {
                        "matches_count": 6
                    },
                    "id_4": {
                        "matches_count": 30
                    }
                }
            },

输出数据帧将有一列“no_of_occurrence”,该行的值为10。

如果数据的结构不是固定的(例如,如果相同的代码应用于结构稍有不同的许多不同数据集),一种方法是将整个结构转换为一个字符串,并在该字符串中搜索
匹配项的出现次数

#创建一个新列,其中包含数据的(json)字符串表示形式
df2=df.withColumn(“json”,F.to_json(F.struct(“abcviolation”))
#定义一个udf,用于统计字符串中“matches\u count”的出现次数
从pyspark.sql.types导入LongType
def计数与def计数(str)匹配:
返回str.count('匹配\u count')
count\u udf=F.udf(count\u匹配\u count,LongType())
#在包含计数的udf的帮助下创建一个新列
df3=df2.withColumn(“count”,count\u udf(“json”))
结果是

+--------------------+--------------------+-----+
|abcviolation | json |计数|
+--------------------+--------------------+-----+
|[1]、[15]、[30]…{“反暴力”:{…}10|
+--------------------+--------------------+-----+

这种方法有一些警告:如果json中有重复的键,在第一步中调用
将丢失数据。如果字符串
与\u count匹配,则计数可能太高。
也作为数据字段名出现。

如果数据的结构不固定(例如,如果相同的代码应应用于结构稍有不同的许多不同数据集),一种方法是将整个结构转换为字符串,并搜索该字符串中出现的
匹配数\u count

#创建一个新列,其中包含数据的(json)字符串表示形式
df2=df.withColumn(“json”,F.to_json(F.struct(“abcviolation”))
#定义一个udf,用于统计字符串中“matches\u count”的出现次数
从pyspark.sql.types导入LongType
def计数与def计数(str)匹配:
返回str.count('匹配\u count')
count\u udf=F.udf(count\u匹配\u count,LongType())
#在包含计数的udf的帮助下创建一个新列
df3=df2.withColumn(“count”,count\u udf(“json”))
结果是

+--------------------+--------------------+-----+
|abcviolation | json |计数|
+--------------------+--------------------+-----+
|[1]、[15]、[30]…{“反暴力”:{…}10|
+--------------------+--------------------+-----+

这种方法有一些警告:如果json中有重复的键,那么在第一步调用
到\u json
会丢失数据。如果字符串
匹配\u count
也作为数据字段名出现在某个地方,那么计数可能太高。

我已经用输出编辑了这个问题。id\u 3出现在示例数据中是错误的吗rs两次?是的。我更新了问题。你能澄清一下你的输入是什么格式吗?在问题文本中,你说你有一个struct类型的列,但在示例代码中,我看到了类似Python/Json对象的内容。列的实际类型是什么在您的输入数据框中?这是因为数据已被格式化为JSON格式。实际列abcviolation为struct类型,因此为2020.06.01.xls和twnin,而matches\u count为long类型。我已将问题与输出一起编辑。示例数据中id\u 3出现两次是否有误?是的。我已更新了问题,请澄清fy您的输入是什么格式?在问题文本中,您说您有一个struct类型的列,但在示例代码中,我看到了类似Python/Json对象的内容。列的实际类型是什么在您的输入数据框中?这是因为数据已被格式化为JSON格式。实际列abcviolation为struct类型,因此为2020.06.01.xls和twnin,而matches_count为long类型。