Spark DataFrame如何基于指定Schema创建多行数据?
如何创建多行数据的Spark DataFrame或追加数据行
方案一:创建时直接传入多行数据
直接把所有数据行打包进一个列表,作为createDataFrame的data参数即可,不需要单独处理单条数据。
示例代码
# 沿用你定义好的Schema my_schema = StructType([ StructField('uid', StringType(), True), StructField('test_id', StringType(), True), StructField("struct_ids", ArrayType( StructType([ StructField("st", IntegerType(), True), StructField("mt", IntegerType(), True), ]) ) ) ]) # 准备多行数据列表 multi_row_data = [ {'uid': 'test', 'test_id': 'test', 'struct_ids': [{'st': 1234, 'mt': 1111}, {'st': 6789, 'mt': 2222}]}, {'uid': 'test2', 'test_id': 'test2', 'struct_ids': [{'st': 3333, 'mt': 114411}, {'st': 333, 'mt': 444}]} ] # 创建包含多行数据的DataFrame df = spark.createDataFrame(data=multi_row_data, schema=my_schema)
方案二:给已有DataFrame追加数据行
如果已经有了初始的单行DataFrame,可以先把新数据做成一个新的单行DataFrame,再用unionByName(推荐,避免列顺序不匹配问题)合并。
示例代码
# 你的初始单行DataFrame创建代码 my_data = {'table_test': {'uid': 'test', 'test_id': 'test', 'struct_ids': [{'st': 1234, 'mt': 1111}, {'st': 6789, 'mt': 2222}]}} df = spark.createDataFrame(data=[my_data['table_test']], schema=my_schema) # 准备要追加的新数据行 new_row_data = {'uid': 'test2', 'test_id': 'test2', 'struct_ids': [{'st': 3333, 'mt': 114411}, {'st': 333, 'mt': 444}]} # 把新数据做成单行DataFrame new_df = spark.createDataFrame(data=[new_row_data], schema=my_schema) # 合并两个DataFrame(unionByName会按列名匹配,比union更稳妥) df = df.unionByName(new_df)
注意点
- 用
union合并时,两个DataFrame的列顺序必须完全一致;unionByName不要求列顺序,按列名匹配,更安全。 - 追加的新数据Schema必须和原DataFrame完全一致,否则会报错。
内容的提问来源于stack exchange,提问作者Blue Clouds
相关产品推荐
相关产品推荐

