gpt4 book ai didi

java - 为什么SparkSession一个action执行两次?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:52 25 4
gpt4 key购买 nike

最近升级到 Spark 2.0,我在尝试从 JSON 字符串创建简单数据集时看到了一些奇怪的行为。这是一个简单的测试用例:

 SparkSession spark = SparkSession.builder().appName("test").master("local[1]").getOrCreate();
JavaSparkContext sc = new JavaSparkContext(spark.sparkContext());

JavaRDD<String> rdd = sc.parallelize(Arrays.asList(
"{\"name\":\"tom\",\"title\":\"engineer\",\"roles\":[\"designer\",\"developer\"]}",
"{\"name\":\"jack\",\"title\":\"cto\",\"roles\":[\"designer\",\"manager\"]}"
));

JavaRDD<String> mappedRdd = rdd.map(json -> {
System.out.println("mapping json: " + json);
return json;
});

Dataset<Row> data = spark.read().json(mappedRdd);
data.show();

输出:

mapping json: {"name":"tom","title":"engineer","roles":["designer","developer"]}
mapping json: {"name":"jack","title":"cto","roles":["designer","manager"]}
mapping json: {"name":"tom","title":"engineer","roles":["designer","developer"]}
mapping json: {"name":"jack","title":"cto","roles":["designer","manager"]}
+----+--------------------+--------+
|name| roles| title|
+----+--------------------+--------+
| tom|[designer, develo...|engineer|
|jack| [designer, manager]| cto|
+----+--------------------+--------+

即使我只执行一个操作,“ map ”功能似乎被执行了两次。我原以为 Spark 会懒惰地构建一个执行计划,然后在需要时执行它,但这看起来似乎要以 JSON 格式读取数据并对其执行任何操作,该计划必须至少执行两次。

在这种简单的情况下无所谓,但是当map函数长时间运行时,这就成了一个大问题。这是正确的,还是我遗漏了什么?

最佳答案

发生这种情况是因为您没有为 DataFrameReader 提供架构。因此,Spark 必须急切地扫描数据集以推断输出模式。

由于 mappedRdd 没有被缓存,它将被计算两次:

  • 一次用于模式推断
  • 调用data.show时一次

如果你想阻止你应该为阅读器提供模式(Scala 语法):

val schema: org.apache.spark.sql.types.StructType = ???
spark.read.schema(schema).json(mappedRdd)

关于java - 为什么SparkSession一个action执行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38924623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com