数据帧的火花联合不给计数吗?

时间:2020-03-04 19:20:26

标签: scala dataframe apache-spark apache-spark-sql

我正在尝试合并这些数据帧,我使用的G_ID不为Null或MCOM.T_ID不为null并使用了修整,计数没有增加,自1小时起运行。 300个任务中仅剩下3个任务。请提出如何调试的建议?为null导致问题,我该如何调试?

enter image description here

enter image description here

 val table1 = spark.sql(""" SELECT  trim(C_ID) AS PC_ID FROM ab.CIDS WHERE 
  _UPDT_TM >= '2020-02-01 15:14:39.527'  """)

val table2 = spark.sql(""" SELECT trim(C_ID) AS PC_ID   FROM ab.MIDS MCOM INNER
 JOIN ab.VD_MBR VDBR
  ON Trim(MCOM.T_ID) = Trim(VDBR.T_ID) AND Trim(MCOM.G_ID) = Trim(VDBR.G_ID)
 AND Trim(MCOM.C123M_CD) IN ('BBB', 'AAA') WHERE MCOM._UPDT_TM >= '2020-02-01 15:14:39.527'
 AND Trim(VDBR.BB_CD) IN ('BBC') """)

var abc=table1.select("PC_ID").union(table2.select("PC_ID"))

even tried this --> filtered = abc.filter(row => !row.anyNull);

2 个答案:

答案 0 :(得分:1)

您似乎有数据偏斜问题。查看“摘要指标”,很明显,(至少)四分之三的分区是空的,因此您消除了spark可以为您提供的大多数潜在并行化。

尽管这将导致洗牌(数据在不同执行者之间通过网络移动),但.repartition()有助于平衡所有分区上的数据并创建更多有效的工作单元在可用核心中。这样很可能会加快您的count()

根据经验,您可能希望在参数设置为至少集群中的核心数的情况下调用.repartition()。将其设置得较高将使任务更快地完成任务(观看进度很有趣),尽管会增加作业运行的总时间的管理开销。如果任务太小(即每个分区的数据不足),则调度程序有时会感到困惑,也不会使用整个集群。总体而言,找到合适数量的分区是一种平衡的行为。

答案 1 :(得分:0)

  1. 已将别名作为“ PC_ID”添加到“ C_ID”列。之后,您要寻找“ C_ID”。

  2. 并且可以对相同数量的列执行联合,而table1和table2的列大小不同。

    otherwise you will get:  org.apache.spark.sql.AnalysisException: Union can only be performed on tables with the same number of columns
    

请先照顾好这两种情况。