【问题标题】:Java Spark - how to generate structType from a json objectJava Spark - 如何从 json 对象生成 structType
【发布时间】:2021-01-28 13:19:02
【问题描述】:

如何在 java 中从 JSON 对象创建结构类型?在我的例子中,JSON 对象是一个 AVRO 模式(我在下面截断了它)。

{\"type\":\"record\",\"name\":\"DataRecord\",\"namespace\":\"com.mycode\",\"fields\":[{\"name\":\"data\",\"type\":{\"type\":\"record\",\"name\":\"Data\",
\"fields\":[{\"name\":\"COUNT\",\"type\":[{\"type\":\"null\"},{\"type\":\"int\"}],\"default\":null},{\"name\":\"VALUE\",\"type\":[{\"type\":\"null\"},{\"type\":\"int\"}],\"default\":null}] }

我不想手动创建 StructType 对象。我已经看到了 Scala 的方法,但在 Java 中没有类似的方法。

【问题讨论】:

    标签: java apache-spark apache-spark-sql avro


    【解决方案1】:

    "org.apache.spark" %% "spark-core" % "2.4.5""com.databricks" %% "spark-avro" % "3.2.0"

    我能够将 Json String Schema 转换为 AVRO Schema,然后再转换为 Struct Type。

    import org.apache.avro.Schema;
    import org.apache.spark.sql.types.StructType;
    import com.databricks.spark.avro.SchemaConverters;
    
    
    String schemaStr ="{ \"type\" : \"record\", \"name\" : \"test_schema\", \"namespace\" : \"com.test.avro\", \"fields\" : [ { \"name\" : \"username\", \"type\" : \"string\", \"doc\"  : \"blah blah\" }, { \"name\" : \"tweet\", \"type\" : \"string\", \"doc\"  : \"test\" }, { \"name\" : \"timestamp\", \"type\" : \"long\", \"doc\"  : \"test\" } ], \"doc:\" : \"test\" }";
    Schema schema = Schema.parse(schemaStr);    
    StructType requiredType = (StructType) SchemaConverters.toSqlType(schema).dataType();
    

    注意:较新版本的 Spark / Scala 默认包含 "com.databricks" %% "spark-avro"

    【讨论】:

    • 谢谢你,请问我怎样才能将具有此结构的相应 json 数据对象存储在 DataFrame 中?即我有模式格式的数据,我想将它存储在数据框中,以便每个属性都是一列?
    • 你可以通过val df = spark.createDataFrame(rowRDD, requiredType)来实现
    • 但是在 Java 中呢?
    • @GMan 只需检查spark.apache.org/docs/2.3.0/… 上的java 选项卡
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2020-02-26
    相关资源
    最近更新 更多