代码之家  ›  专栏  ›  技术社区  ›  Am1rr3zA

同时在两个序列上进行Scala循环

  •  0
  • Am1rr3zA  · 技术社区  · 7 年前

    我有两个Scala序列,我需要检查它们是否相等, 忽略可为空列 .

    val schemaA = StructType(Seq(StructField("date",DateType,true), StructField("account_name",StringType,true)))
    
    val df_A = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schemaA)
    
    val schemaB = StructType(Seq(StructField("date",DateType,false), StructField("account_name",StringType,true)))
    
    val df_B = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schemaB)
    

    在python中,我可以简单地这样做:

     print(
         all(        
             for a,b in zip(df_A.schema, df_B.schema)
               (a.name, a.dataType) == (b.name, b.dataType)
         )
     )
    

    但我还是坚持做同样的事 Scala ,有什么建议吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Dima    7 年前

    另一种绕过评论中提到的“额外列”问题的方法是:

    val result = schemaA.map { a => a.name -> a.type } == schemaB.map { b => b.name -> b.type }
    
        2
  •  2
  •   Tzach Zohar    7 年前

    与Python解决方案非常类似:

    val result: Boolean = schemaA.zip(schemaB).forall {
      case (a, b) => (a.name, a.dataType) == (b.name, b.dataType)
    }
    

    (不需要使用DFs)。

    请注意,此解决方案和python解决方案都可能返回 true 当其中一个架构有其他架构没有的额外字段时,因为 zip 会忽略他们。

    推荐文章