如何将特定代码片段从Spark 1.6.2转换为Spark 2.2.0?

时间:2017-12-13 12:10:57

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

我需要将我的Spark 1.6.2代码传递给Java中的Spark 2.2.0。

 DataFrame eventsRaw = sqlContext.sql("SELECT * FROM my_data");
 Row[] rddRows = eventsRaw.collect();
 for (int rowIdx = 0; rowIdx < rddRows.length; ++rowIdx)
 {
     Map<String, String> myProperties = new HashMap<>();
     myProperties.put("startdate", rddRows[rowIdx].get(1).toString());
     JEDIS.hmset("PK:" + rddRows[rowIdx].get(0).toString(), myProperties); // JEDIS is a Redis client for Java
 }

据我所知,Spark 2.2.0 for Java中没有DataFrame。只有1个}}。但是,如果我将Dataset替换为DataFrame,那么我会Dataset而不是Object[]作为Row[]的输出。然后eventsRaw.collect()标记为红色,我无法编译代码。

我怎样才能正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

DataFrame(Scala)是Dataset<Row>

SparkSession spark;

...

Dataset<Row> eventsRaw = spark.sql("SELECT * FROM my_data");

但您应该使用collect而不是foreach(使用延迟单例连接):

eventsRaw.foreach(
   (ForeachFunction<Row>) row -> ... // replace ... with appropriate logic
);  

foreachPartition(初始化每个分区的连接):

eventsRaw.foreachPartition((ForeachPartitionFunction<Row)) rows -> {
   ... // replace ... with appropriate logic
})