繁体   English   中英

使用 Java Spark 加载现有的 Mongodb 到 Hive

[英]Using Java Spark Load Existing Mongodb to Hive

目标

我正在使用 Spark (2.3.1) 和 Java 处理 ETL Mongodb 到 Hive

我在哪里 注册护士

我可以加载现有的 Mongodb 并显示/查询数据

问题

但我有问题将它保存到蜂巢表。

mongodb 数据结构

当前 mongodb 数据是复杂的嵌套字典(结构类型),有没有办法更容易地转换以保存在 hive 中?

public static void main(final String[] args) throws InterruptedException {
    // spark session read mongodb
    SparkSession mongo_spark = SparkSession.builder()
            .master("local")
            .appName("MongoSparkConnectorIntro")
            .config("mongo_spark.master", "local")
            .config("spark.mongodb.input.uri", "mongodb://localhost:27017/test_db.test_collection")
            .config("spark.mongodb.output.uri", "mongodb://localhost:27017/test_db.test_collection")
            .enableHiveSupport()
            .getOrCreate();

    // Create a JavaSparkContext using the SparkSession's SparkContext object
    JavaSparkContext jsc = new JavaSparkContext(mongo_spark.sparkContext());

    // Load data and infer schema, disregard toDF() name as it returns Dataset
    Dataset<Row> implicitDS = MongoSpark.load(jsc).toDF();
    implicitDS.printSchema();
    implicitDS.show();

    // createOrReplaceTempView
    implicitDS.createOrReplaceTempView("my_table");
    // mongo_spark.sql("DROP TABLE IF EXISTS my_table");
    // cannot save table this step
    // implicitDS.write().saveAsTable("my_table");
    // can query the temp view
    mongo_spark.sql("SELECT * FROM my_table limit 1").show();

    // More application logic would go here...
    JavaMongoRDD<Document> rdd = MongoSpark.load(jsc);
    System.out.println(rdd.count());
    System.out.println(rdd.first().toJson());

    jsc.close();
}

有没有人有在 Java 中做这个 ETL spark 工作的经验? 我真的很感激。

随着工作的深入,我意识到这是一个广泛的问题。 这个问题的准确答案是

public static void main(final String[] args) throws InterruptedException {
    // spark session read mongodb
    SparkSession mongo_spark = SparkSession.builder()
            .master("local")
            .appName("MongoSparkConnectorIntro")
            .config("mongo_spark.master", "local")
            .config("spark.mongodb.input.uri", "mongodb://localhost:27017/test_db.test_collection")
            .config("spark.mongodb.output.uri", "mongodb://localhost:27017/test_db.test_collection")
            .enableHiveSupport()
            .getOrCreate();

    // Create a JavaSparkContext using the SparkSession's SparkContext object
    JavaSparkContext jsc = new JavaSparkContext(mongo_spark.sparkContext());

    // Load data and infer schema, disregard toDF() name as it returns Dataset
    Dataset<Row> implicitDS = MongoSpark.load(jsc).toDF();
    implicitDS.printSchema();
    implicitDS.show();

    // createOrReplaceTempView
    implicitDS.createOrReplaceTempView("my_table");
    mongo_spark.sql("DROP TABLE IF EXISTS my_table");
    implicitDS.write().saveAsTable("my_table");

    jsc.close();
}

所以实际上代码正在运行,但阻止我的是我的数据中发生的事情

  1. 单个字段的冲突数据类型(com.mongodb.spark.exceptions.MongoTypeConversionException:无法转换...) - 这可以解决在加载时增加样本大小,检查 java 语法如何配置 Java Spark sparksession 样本大小

  2. 嵌套结构中的 nulltype - 这个我仍在寻找 Java 中的解决方案

由于我获得了 Scala 代码示例的许多研究,我会尽我所能记录我的发现,希望有一天它可以节省您的时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM