簡體   English   中英

通過PySpark中不同的sub-ArrayType元素進行計數

[英]Counting by distinct sub-ArrayType elements in PySpark

我有以下JSON結構:

{ 
   "stuff": 1, "some_str": "srt", list_of_stuff": [
                  {"element_x":1, "element_y":"22x"}, 
                  {"element_x":3, "element_y":"23x"}
                ]
}, 
{ 
   "stuff": 2, "some_str": "srt2", "list_of_stuff": [
                  {"element_x":1, "element_y":"22x"}, 
                  {"element_x":4, "element_y":"24x"}
                ]
}, 

當我將它讀入PySpark DataFrame作為json時:

import pyspark.sql
import json
from pyspark.sql import functions as F
from pyspark.sql.types import *

schema = StructType([
       StructField("stuff", IntegerType()),
       StructField("some_str", StringType()),
       StructField("list_of_stuff", ArrayType(
               StructType([
                   StructField("element_x", IntegerType()),
                   StructField("element_y", StringType()),
    ])
))
])


df = spark.read.json("hdfs:///path/file.json/*", schema=schema)
df.show()

我得到以下內容:

+--------+---------+-------------------+
| stuff  | some_str|    list_of_stuff  |
+--------+---------+-------------------+
|   1    |   srt   |  [1,22x], [3,23x] |
|   2    |   srt2  |  [1,22x], [4,24x] |
+--------+---------+-------------------+

好像PySpark展平了ArrayType的鍵名,盡管我在執行df.printSchema()時仍然可以看到它們:

root
|-- stuff: integer (nullable = true)
|-- some_str: string (nullable = true)
|-- list_of_stuff: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- element_x: integer (nullable = true)
|    |    |-- element_y: string (nullable = true)

問題:我需要計算DataFrame中element_y的不同出現次數。 因此,以示例JSON為例,我將獲得以下輸出:

22x: 2, 23x: 1, 24x :1

我不確定如何進入ArrayType並計算子元素element_y的不同值。 任何幫助表示贊賞。

一種方法是使用rdd ,使用flatMap flatten數組,然后計數:

df.rdd.flatMap(lambda r: [x.element_y for x in r['list_of_stuff']]).countByValue()
# defaultdict(<class 'int'>, {'24x': 1, '22x': 2, '23x': 1})

或使用數據幀時, explode第一列,則可以訪問element_y每個陣列中; 通過element_y groupBy ,然后count應該給出您需要的結果:

import pyspark.sql.functions as F
(df.select(F.explode(df.list_of_stuff).alias('stuff'))
   .groupBy(F.col('stuff').element_y.alias('key'))
   .count()
   .show())
+---+-----+
|key|count|
+---+-----+
|24x|    1|
|22x|    2|
|23x|    1|
+---+-----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM