我是Spark和Scala的新手,我想优化我在Spark上编写的请求,该请求非常非常繁重且缓慢(我的数据库很大,包含大量数据)。
我有一个第一个表"city_ID":
ID City_CODE
1 10
2 11
3 12
第二个表"city_name"与第一个表具有共同字段:
City_Code City_NAME_CRYPT
10 ADFKJV - Paris
11 AGHDFBNLKFJ - London
12 AGZEORIUYG- Madrid
我想在最终结果中拥有的是城市 ID 及其专有名称(我可以使用 city_name 字段上的正则表达式进行计算),而无需任何其他数据。所以,它应该看起来像这样:
ID NAME
10 Paris
11 London
12 Madrid
这是我当前的代码:
val result = spark.sql(""" SELECT t1.id, t2.city_name_crypt AS name_crypt
FROM table1 t1
INNER JOIN table2
on t1.city_code = t2.city_code""").withColumn("name", regexp_extract($"name_crypt", ".*?(\d+)\)$", 1)).drop($"name_crypt").show()
对我来说最大的问题是我只想有 2 列,而不是 3 列!但是由于我进行了内部联接,因此我有义务将第三列保留在我的数据帧上,而它在我的情况下毫无用处。这就是为什么我在 with 列方法之后使用下降的原因。
你能帮我解决这个问题吗?提前谢谢你!
这不是让它变慢的原因。 但是你可以像这样使用列重命名...
result.withColumnRenamed("name", regexp_extract($"name_crypt", ".*?(\d+)\)$", 1))
如果你是Spark的新手,很多人一开始不会并行化任务。也许你应该确保任务的并行化是好的。检查num-executors
和executor-memory
https://spark.apache.org/docs/latest/configuration.html
下面是一个示例 火花提交命令...
spark-submit
--class yourClass
--master yarn
--deploy-mode cluster
--executor-memory 8G
--num-executors 40
/path/to/myJar.jar