【问题标题】:Compare two Spark Schemas in Java, Unable to Cast Seq<StructField> to List<StructField>比较 Java 中的两个 Spark 模式,无法将 Seq<StructField> 转换为 List<StructField>
【发布时间】:2020-11-04 07:14:44
【问题描述】:

问题:我想在 DDL 格式中获取两个模式之间的公共属性。

我有以下工作代码来获取 scala 中的模式交集:

val diff = df1.schema.intersect(df2.schema)
val sb = new StringBuilder(); 
diff.toStream.foreach(x => sb.append( x.toDDL + ", "))

但我在将此片段转换为 Java 时遇到了转换问题:

StructType s1 = new StructType().add("col1",StringType)
                                .add("col2",StringType)
                                .add("col3",StringType)
                                .add("col4",StringType);

StructType s2 = new StructType().add("col1",StringType)
                                .add("col4",StringType);

System.out.println("Output :" + s1.toList().intersect(s2.toList()));

Output :List(StructField(col1,StringType,true), StructField(col4,StringType,true))

我无法将此输出转换为 DDL。我尝试将上面的对象作为 Seq 读取,但由于编译错误而失败:

    Seq<StructField> result = s1.toList().intersect(s2.toList());

Error: java: incompatible types: java.lang.Object cannot be converted to scala.collection.Seq<org.apache.spark.sql.types.StructField>

再试一次:

StringBuilder sb = new StringBuilder();
    s1.toList().intersect(s2.toList()).foreach( (schema) -> sb.append(schema.toDDL() + ","));

Error:(81, 39) java: cannot find symbol
  symbol:   method foreach((schema)->[...] ","))
  location: class java.lang.Object

关于如何将其读取为List&lt;StructType&gt; 的任何指针,以便我可以将其转换为 DDL?

【问题讨论】:

    标签: java scala apache-spark apache-spark-sql scala-collections


    【解决方案1】:

    我知道的唯一方法是使用JavaConversions,类似

    Object something = s1.toList().intersect(s2.toList());
    List<StructField> result = JavaConversions.seqAsJavaList((Seq<StructField>)something);
    System.out.println("Output :" + result);
    

    ...将打印出来

    Output :[StructField(col1,StringType,true), StructField(col4,StringType,true)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2017-12-21
      • 2016-08-22
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多