我是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。
您能帮我解决此问题吗? 预先谢谢你!
答案 0 :(得分:3)
我认为这并不是让它变慢的原因。但是您可以像这样使用withColumnRenamed ...
result.withColumnRenamed("name", regexp_extract($"name_crypt", ".*?(\\d+)\\)$", 1))
如果您是Spark的新手,很多人起初不会并行处理任务。也许您应该确保任务的并行化良好。检查num-executors
和executor-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