我们在Hive表中有客户数据,在另一个Hive表中有销售数据,其中有TB的数据。我们正在尝试为多个客户提取销售数据并将其保存到文件中。
到目前为止我们尝试了什么:
我们厌倦了客户和销售表之间的左外连接,但由于巨大的销售数据,它无法正常工作。
val data = customer.join(sales,"customer.id" = "sales.customerID",leftouter)
所以替代方法是根据特定客户区域列表提取数据表单销售表,并查看该区域数据是否具有客户数据,如果存在数据则将其保存在其他数据框中并将数据加载到同一数据框中以供所有区域。
我的问题是,是否支持在数据帧中多次插入数据。
答案 0 :(得分:0)
如果销售数据框大于客户数据框,那么您只需在连接操作中切换数据框的顺序。
val data = sales.join(customer,"customer.id" === "sales.customerID", "left_outer")
您还可以为Spark添加提示以广播较小的数据帧,但我相信它需要小于2GB:
import org.apache.spark.sql.functions.broadcast
val data = sales.join(broadcast(customer),"customer.id" === "sales.customerID", "leftouter")
使用其他方法并迭代合并数据帧也是可能的。为此,您可以使用union
方法(Spark 2.0+)或unionAll
(旧版本)。此方法将数据框附加到另一个。如果您有一个要彼此合并的数据框列表,则可以将union
与reduce
一起使用:
val dataframes = Seq(df1, df2, df3)
dataframes.reduce(_ union _)