【问题标题】:Case sensitive join in SparkSpark 中区分大小写的连接
【发布时间】:2021-09-15 14:00:15
【问题描述】:

我正在处理一个需要编写区分大小写的连接条件的场景。为此,我发现有一个可以更改的 spark 配置属性 spark.sql.caseSensitive。但是,如果我将此属性设置为TrueFalse,对最终结果集没有影响。 在这两种方式中,我都没有从下面的示例PySpark 代码中获得language=java 的结果。任何人都可以帮助如何处理这种情况吗?

spark.conf.set("spark.sql.caseSensitive", False)

columns1 = ["language","users_count"]
data1 = [("Java", "20000"), ("Python", "100000"), ("Scala", "3000")]

columns2 = ["language","note"]
data2 = [("java", "JVM based"), ("Python", "Indentation is imp"), ("Scala", "Derived from Java")]

df1 = spark.createDataFrame(data1, columns1)
df2 = spark.createDataFrame(data2, columns2)

#df1.createOrReplaceTempView("df1")
#df2.createOrReplaceTempView("df2")

df = df1.join(df2, on="language", how="inner")
display(df)

【问题讨论】:

  • 是什么阻止您向连接列添加一致的转换 - df1.join(df2, F.lower(df1["language"]) == F.lower(df2["language"]), how="inner")
  • 提供的数据是样本数据。在实际场景中,有 123Abc 和 123aBc 之类的字母数字 id。在我的情况下,这些是不同的 ID。看起来这种区分大小写的连接默认情况下正在发生。但是,现在我正在寻找一个属性,我可以使用它来改变这种区分大小写。

标签: apache-spark pyspark databricks


【解决方案1】:
  1. 我对@9​​87654321@的理解是它影响的是SQL,而不是数据。

  2. 至于您的联接本身,如果您不想小写或大写您的数据,我可以理解为什么,您可以创建一个key 列,这是您要加入的值的小写版本。如果您遇到更复杂的情况,您的key 列甚至可以成为一个/多个列的md5()。确保所有内容都保持小写/大写,以便进行比较。

【讨论】:

  • 同意。在这种情况下, md5() 将是更好的方法。但是,是否有任何标准属性可用于更改连接条件区分大小写?我们可以在 SQL Server 连接中给出类似“COLLATE Latin1_General_100_CS_AS”的提示。
  • 我讨厌法语中讨厌的排序规则:)。排序规则不应该影响您的加入,编码可以,但我很确定如果您使用正确的代码集摄取,Spark 会摆脱特定的编码。
猜你喜欢
  • 2016-08-28
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2017-04-26
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多