![](/img/trans.png)
[英]How to compare values of two dictionaries that have different keys in python
[英]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.