[英]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();
}
所以实际上代码正在运行,但阻止我的是我的数据中发生的事情
单个字段的冲突数据类型(com.mongodb.spark.exceptions.MongoTypeConversionException:无法转换...) - 这可以解决在加载时增加样本大小,检查 java 语法如何配置 Java Spark sparksession 样本大小
嵌套结构中的 nulltype - 这个我仍在寻找 Java 中的解决方案
由于我获得了 Scala 代码示例的许多研究,我会尽我所能记录我的发现,希望有一天它可以节省您的时间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.