TRIM 和 TRIM 两者在 Spark 中的区别

Differences of TRIM and TRIM BOTH in Spark

我创建了一个名为 old_ticket_df 的 Spark SQL 临时视图。在临时视图 old_ticket_df 中,我有一列“approver”,它似乎有空格。我曾尝试使用 trim() 删除空格,但似乎没有效果。如果我尝试使用 trim(BOTH '\t' from approver) 删除空格,它似乎删除了空格。

我从下面的 compare_query 创建了一个名为 compare_df 的 Spark 数据框,我在其中将两个示例结合在一起,将 trim 函数的两个不同版本应用于同一字段和价值。代码的输出如下。

谁能告诉我 Spark SQL 中的 TRIM(approver)TRIM(BOTH '\t' FROM approver) 有什么区别?

代码:

compare_query="""
select * from (
select 'ver1' as data_source,  TRIM(BOTH '\t' FROM approver) as  approver
from old_ticket_df
where ticketid='xxxxx'
and ticketlineid='yyyyyyy'
and storeid='00'
and dateclosed='2020-06-06'
union
select 'ver2' as data_source, TRIM(approver) as approver
from old_ticket_df
where ticketid='xxxxx'
and ticketlineid='yyyyyyy'
and storeid='00'
and dateclosed='2020-06-06'
)
"""
compare_df=spark.sql(compare_query)
compare_df.show(truncate=False)

输出:

+-----------+------------------------+
|data_source|approver                |
+-----------+------------------------+
|ver2       |user1@GMAIL.COM    |
|ver1       |user1@GMAIL.COM |
+-----------+------------------------+

trim(str) 仅删除 space 个字符。
trim(BOTH trimStr FROM str) 删除您在 trimStr 中指定的字符。

Spark's trim documentation

示例:

df = spark.createDataFrame([(' SPACES ', ), ('\tTABS\t', )], ['str'])
df.createOrReplaceTempView("sql_df")
spark.sql("""
SELECT str,
       TRIM(str) as trim,
       TRIM(BOTH '\t' FROM str) as trim_both_tab,
       TRIM(BOTH ' \t' FROM str) as trim_both_tab_space
FROM sql_df
""").show()
#+--------+--------+-------------+-------------------+
#|     str|    trim|trim_both_tab|trim_both_tab_space|
#+--------+--------+-------------+-------------------+
#| SPACES |  SPACES|      SPACES |             SPACES|
#|\tTABS\t|\tTABS\t|         TABS|               TABS|
#+--------+--------+-------------+-------------------+
  • str 是原始值“SPACES”(周围有 space 个字符)和值“\tTABS\t”(周围有制表符)。
  • trim 列显示 trim(str) 的结果。 Space 个字符被删减,但保留制表符。
  • trim_both_tab 列显示 TRIM(BOTH '\t' FROM str) 的结果。制表符被修剪,但 space 个字符保留。
  • trim_both_tab_space 显示 TRIM(BOTH ' \t' FROM str) 的结果。 space 和制表符都被删除了,因为它们都被提供了。

在你的情况下,TRIM(approver) 只删除了 spaces,所以在 ver2 行你仍然有制表符。虽然 TRIM(BOTH '\t' FROM approver) 只删除了选项卡,但 spaces 保持不变。