如何在Spark Scala中优化withColumn?

时间:2018-12-26 14:52:12

标签: scala apache-spark apache-spark-sql

我是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。

您能帮我解决此问题吗? 预先谢谢你!

1 个答案:

答案 0 :(得分: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