- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有 SELECT [...] UNION ALL SELECT [...]
形式的 Spark SQL 语句,这两个 SELECT
语句是否会并行执行?在我的特定用例中,两个 SELECT
正在查询两个不同的数据库表。与我的预期相反,Spark UI 似乎表明这两个 SELECT
语句是按顺序执行的。
== 更新 1 ==
下面是 Spark UI 中显示的实际计划:
== Physical Plan ==
*Sort [avg_tip_pct#655 DESC NULLS LAST], true, 0
+- Exchange rangepartitioning(avg_tip_pct#655 DESC NULLS LAST, 4)
+- *HashAggregate(keys=[neighborhood#163], functions=[avg(tip_pct#654)], output=[neighborhood#163, avg_tip_pct#655])
+- Exchange hashpartitioning(neighborhood#163, 4)
+- *HashAggregate(keys=[neighborhood#163], functions=[partial_avg(tip_pct#654)], output=[neighborhood#163, sum#693, count#694L])
+- *Project [neighborhood#163, (tip_amount#513 / total_amount#514) AS tip_pct#654]
+- InMemoryTableScan [neighborhood#163, tip_amount#513, total_amount#514]
+- InMemoryRelation [pickup_latitude#511, pickup_longitude#512, tip_amount#513, total_amount#514, neighborhood#163, index#165], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
+- *Project [pickup_latitude#301, pickup_longitude#300, tip_amount#310, total_amount#313, neighborhood#163, index#165]
+- *Project [pickup_latitude#301, index#165, pickup_longitude#300, neighborhood#163, total_amount#313, point#524, polygon#164, tip_amount#310]
+- *SortMergeJoin [curve#578], [curve#580], Inner, ((relation#581 = Within) || Within(point#524, polygon#164))
:- *Sort [curve#578 ASC NULLS FIRST], false, 0
: +- Exchange hashpartitioning(curve#578, 4)
: +- Generate inline(indexer(point#524, 30)), true, false, [curve#578, relation#579]
: +- Union
: :- *Project [pickup_latitude#301, pickup_longitude#300, tip_amount#310, total_amount#313, pointconverter(pickup_longitude#300, pickup_latitude#301) AS point#524]
: : +- *Filter ((isnotnull(total_amount#313) && payment_type#306 IN (CREDIT,CRD,1)) && (total_amount#313 > 200.0))
: : +- *Scan BigQueryTableRelation({datasetId=new_york, projectId=bigquery-public-data, tableId=tlc_yellow_trips_2014},org.apache.spark.sql.SQLContext@3bf2de09) [pickup_latitude#301,payment_type#306,pickup_longitude#300,total_amount#313,tip_amount#310] PushedFilters: [IsNotNull(total_amount), In(payment_type, [CREDIT,CRD,1]), GreaterThan(total_amount,200.0)], ReadSchema: struct<pickup_latitude:double,pickup_longitude:double,tip_amount:double,total_amount:double,point...
: +- *Project [pickup_latitude#436, pickup_longitude#435, tip_amount#445, total_amount#448, pointconverter(pickup_longitude#435, pickup_latitude#436) AS point#524]
: +- *Filter ((isnotnull(total_amount#448) && payment_type#441 IN (CREDIT,CRD,1)) && (total_amount#448 > 200.0))
: +- *Scan BigQueryTableRelation({datasetId=new_york, projectId=bigquery-public-data, tableId=tlc_yellow_trips_2015},org.apache.spark.sql.SQLContext@3bf2de09) [payment_type#441,pickup_longitude#435,pickup_latitude#436,total_amount#448,tip_amount#445] PushedFilters: [IsNotNull(total_amount), In(payment_type, [CREDIT,CRD,1]), GreaterThan(total_amount,200.0)], ReadSchema: struct<pickup_latitude:double,pickup_longitude:double,tip_amount:double,total_amount:double,point...
+- *Sort [curve#580 ASC NULLS FIRST], false, 0
+- Exchange hashpartitioning(curve#580, 4)
+- Generate inline(index#165), true, false, [curve#580, relation#581]
+- InMemoryTableScan [neighborhood#163, polygon#164, index#165]
+- InMemoryRelation [neighborhood#163, polygon#164, index#165], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
+- *Project [UDF:metadata_string(metadata#13, neighborhood) AS neighborhood#163, polygon#12, index#15]
+- InMemoryTableScan [metadata#13, polygon#12, index#15]
+- InMemoryRelation [point#10, polyline#11, polygon#12, metadata#13, valid#14, index#15], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas), `neighborhoods`
+- *Scan GeoJSONRelation(gs://miraisolutions/public/sparkgeo/nyc_neighborhoods.geojson,Map(type -> geojson, magellan.index -> true, magellan.index.precision -> 30, path -> gs://miraisolutions/public/sparkgeo/nyc_neighborhoods.geojson)) [point#10,polyline#11,polygon#12,metadata#13,valid#14,index#15] ReadSchema: struct<point:struct<type:int,xmin:double,ymin:double,xmax:double,ymax:double,x:double,y:double>,p...
请注意两个 SELECT
的联合,以扫描 BigQueryTableRelation
的形式出现。这些似乎是按顺序执行的。
每个 BigQuery 选择都在一个单独的作业中执行(每个作业都有一个阶段)- 按顺序执行。我运行一个 5 节点 YARN 集群,每个集群有 4 个 CPU 和 26GB 内存。我想知道我有一个自定义 BigQuery 数据源这一事实在这里是否重要。我希望它不应该。无论如何,作为引用,数据源可以在这里找到:github.com/miraisolutions/spark-bigquery
== 更新 2 ==
在 Spark 日志中,我看到以下日志条目:
19 年 17 月 12 日 14:36:24 信息 SparkSqlParser:解析命令:选择“pickup_latitude”作为“pickup_latitude”,“pickup_longitude”作为“pickup_longitude”,“tip_amount”作为“tip_amount”,“total_amount”作为“total_amount”
从 ((选择 *
来自 `trips2014`)
联合所有
(选择 *
来自 `trips2015`)) `ggcyamhubf`
WHERE (`payment_type` IN ("CREDIT", "CRD", "1"))
Spark 优化此查询并将谓词向下推送到数据源(在本例中为 BigQuery)。然而,相应的 BigQuery 作业似乎完全按顺序执行,即第二个作业仅在第一个作业完成后触发。
最佳答案
TL;DR 是(视 CPU 可用性而定)
附带说明:如果您有疑问,您也可以在它们自己的线程上执行两个 SELECT,然后执行 union
(这同样取决于 CPU 的数量),但是您肯定会有真正的并行执行。
让我们使用(非常基本的)以下查询:
val q = spark.range(1).union(spark.range(2))
explain
不会从 CPU 的角度告诉您最终的执行情况,但至少会告诉您是否正在使用整个阶段的代码生成以及查询树的上层距离。
scala> q.explain
== Physical Plan ==
Union
:- *Range (0, 1, step=1, splits=8)
+- *Range (0, 2, step=1, splits=8)
在此示例中,两个 Range
物理运算符(负责两个单独的数据集)将获得“codegend”,因此它们的执行是流水线式的。它们的执行时间是完成处理分区中所有行的时间(在不处理可能使用 System.sleep
或类似代码的 Java 代码本身的“机制”的情况下尽可能快)。
查询的 RDD 谱系可以为您提供有关查询执行的更多信息。
scala> q.rdd.toDebugString
res4: String =
(16) MapPartitionsRDD[17] at rdd at <console>:26 []
| MapPartitionsRDD[16] at rdd at <console>:26 []
| UnionRDD[15] at rdd at <console>:26 []
| MapPartitionsRDD[11] at rdd at <console>:26 []
| MapPartitionsRDD[10] at rdd at <console>:26 []
| ParallelCollectionRDD[9] at rdd at <console>:26 []
| MapPartitionsRDD[14] at rdd at <console>:26 []
| MapPartitionsRDD[13] at rdd at <console>:26 []
| ParallelCollectionRDD[12] at rdd at <console>:26 []
除非我弄错了,因为中间没有任何阶段,所以你可以并行化的东西不多——它只是一个有 16 个分区的阶段,它的完成速度与最后一个任务一样快(来自要安排的 16 个任务).
这意味着在这种情况下顺序确实很重要。
我还找到了this JIRA issue关于 UNION ALL
如果不完全像你的情况,它看起来很相似。
关于apache-spark - 是否 UNION ALL 并行执行不同表上的两个 SELECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47837955/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!