Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Python字典具有不同的键时,将它们组合到Spark数据帧中_Python_Apache Spark_Dictionary_Pyspark_Apache Spark Sql - Fatal编程技术网

当Python字典具有不同的键时,将它们组合到Spark数据帧中

当Python字典具有不同的键时,将它们组合到Spark数据帧中,python,apache-spark,dictionary,pyspark,apache-spark-sql,Python,Apache Spark,Dictionary,Pyspark,Apache Spark Sql,如果我有一个类似以下内容的词典列表: 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”将被完全删除 通过对字典顺序的研究,我发现它遵从于列表中首先出现的字典中的键,

如果我有一个类似以下内容的词典列表:

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”


事实上,这个列表中有两个以上的字典,并且不能保证每个字典的键都是相同的,所以我找到一种可靠的方法来处理可能不同的键是很重要的

您可以将字典传递给函数

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
,因为不推荐使用字典的模式推断。使用
对象创建数据框需要所有字典具有相同的列

通过合并所有相关字典中的键以编程方式定义架构

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)))

输出数据帧应该是什么样子?在我上面的示例中,对应于第一个字典的行对于列“d”和“e”应该有null/na值,对应于第二个字典的行对于列“a”应该有null/na值。所有其他键都是共享的,因此它们应该基于键显示在相应的列中。这是否回答了您的问题?我认为这是上述内容的完全复制品。不完全是。我之前遇到过上述问题,但它建议使用sc.parallelize,当字典大小不同时,它不会返回所需的数据帧。@Vamsi Prabhala,我有一个简单得多的问题,但逻辑类似。提前谢谢!