将数据附加到空数据帧

时间:2018-05-03 12:51:25

标签: apache-spark apache-kafka apache-spark-sql spark-streaming

我正在创建一个空数据帧,然后尝试将另一个数据框附加到该数据帧。事实上,我希望根据即将到来的RDD数量动态地将许多数据帧附加到最初为空的数据帧。

如果我将值赋给另一个第三个数据帧,union()函数可以正常工作。

val df3=df1.union(df2)

但是我想继续追加我创建的初始数据帧(空),因为我想将所有RDD存储在一个数据帧中。但是下面的代码没有显示正确的计数。似乎它根本没有追加

df1.union(df2)

df1.count() // this shows 0 although df2 has some data and that is shown if I assign to third datafram. 

如果我执行以下操作(由于df1是val,我得到重新分配错误。如果我将其更改为var类型,我会得到kafka多线程不安全错误。

df1=d1.union(df2) 

知道如何将所有动态创建的数据帧添加到最初创建的数据框中吗?

2 个答案:

答案 0 :(得分:1)

DataFrames和其他分布式数据结构是不可变的,因此对它们进行操作的方法总是返回新对象。没有附加,没有修改,也没有ALTER TABLE等效。

  

如果我将其更改为var类型,我会得到kafka多线程不安全的错误。

如果没有实际代码是不可能给你一个明确的答案,但它不太可能与union代码相关。

由于内部实现不正确导致了许多已知的Spark错误(SPARK-19185SPARK-23623只列举了几个)。

答案 1 :(得分:0)

不确定这是否是您要寻找的东西!

# Import pyspark functions
from pyspark.sql.types import StructType, StructField, IntegerType, StringType 

# Define your schema
field = [StructField("Col1",StringType(), True), StructField("Col2", DoubleType(), True)]
schema = StructType(field)

# Your empty data frame
df = spark.createDataFrame(sc.emptyRDD(), schema)

l = []

for i in range(5):
# Build and append to the list dynamically
l = l + [([str(i), i])]

# Create a temporary data frame similar to your original schema
temp_df = spark.createDataFrame(l, schema)

# Do the union with the original data frame
df = df.union(temp_df)