0

我是 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 column 方法之后使用 drop 的原因。

你能帮我解决这个问题吗?先感谢您!

4

1 回答 1

3

我认为这不是让它变慢的原因。但是您可以像这样使用 withColumnRenamed ...

result.withColumnRenamed("name", regexp_extract($"name_crypt", ".*?(\\d+)\\)$", 1))

如果您是 Spark 的新手,很多人一开始不会并行化这些任务。也许你应该确保你的任务并行化是好的。检查num-executorsexecutor-memory

https://spark.apache.org/docs/latest/configuration.html

这是一个示例 spark-submit 命令...

spark-submit \

  --class yourClass \

  --master yarn \

  --deploy-mode cluster \  

  --executor-memory 8G \

  --num-executors 40 \

  /path/to/myJar.jar 
于 2018-12-26T18:33:56.167 回答