簡體   English   中英

當字典具有不同的鍵時,將 Python 字典合並到 Spark 數據幀中

[英]Combining Python dictionaries into a Spark dataframe when the dictionaries have different keys

如果我有一個看起來像這樣的字典列表:

list = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}]

如何將列表轉換為 Spark 數據幀而不刪除字典之間可能不共享的任何鍵? 例如,如果我使用 sc.parallelize(list).toDF(),則生成的數據幀將包含列 'a'、'b' 和 'c',其中第二個字典的列 'a' 為空,而列 '第二個字典中的 d' 和 'e' 將被完全刪除。

通過處理字典的順序,我看到它遵循字典中首先出現在列表中的鍵,所以如果我在上面的例子中交換字典,我的結果數據框將包含列 'b' 、'c'、'd' 和 'e'。

實際上,此列表中的字典將遠遠不止兩個,並且不能保證字典之間的鍵相同,因此找到一種可靠的方法來處理可能不同的鍵非常重要。

您可以將字典傳遞給createDataFrame函數。

l = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}]
df = spark.createDataFrame(l)
#UserWarning: inferring schema from dict is deprecated,please use pyspark.sql.Row instead
#warnings.warn("inferring schema from dict is deprecated
df.show()

+----+---+---+----+----+
|   a|  b|  c|   d|   e|
+----+---+---+----+----+
|   1|  2|  3|null|null|
|null|  4|  5|   6|   7|
+----+---+---+----+----+

還為列提供schema ,因為不推薦使用字典的架構推斷。 使用Row對象創建數據框要求所有字典都具有相同的列。

通過合並所有涉及的字典的鍵以編程方式定義模式。

from pyspark.sql.types import StructType,StructField,IntegerType

#Function to merge keys from several dicts
def merge_keys(*dict_args):
    result = set()
    for dict_arg in dict_args:
        for key in dict_arg.keys():
            result.add(key)
    return sorted(list(result))

#Generate schema given a column list
def generate_schema(columns):
    result = StructType()
    for column in columns:
        result.add(column,IntegerType(),nullable=True) #change type and nullability as needed
    return result

df = spark.createDataFrame(l,schema=generate_schema(merge_keys(*l)))

暫無
暫無

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

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