Spark 中区分大小写的连接

Posted

技术标签:

【中文标题】Spark 中区分大小写的连接【英文标题】:Case sensitive join in Spark 【发布时间】: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。看起来这种区分大小写的连接默认情况下正在发生。但是,现在我正在寻找一个属性,我可以使用它来改变这种区分大小写。 【参考方案1】:

    我对@9​​87654321@的理解是它影响的是SQL,而不是数据。

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

【讨论】:

同意。在这种情况下, md5() 将是更好的方法。但是,是否有任何标准属性可用于更改连接条件区分大小写?我们可以在 SQL Server 连接中给出类似“COLLATE Latin1_General_100_CS_AS”的提示。 我讨厌法语中讨厌的排序规则:)。排序规则不应该影响您的加入,编码可以,但我很确定如果您使用正确的代码集摄取,Spark 会摆脱特定的编码。

以上是关于Spark 中区分大小写的连接的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 中区分大小写的短语搜索

导航栏在 Visual Studio 2017 中区分大小写

.emacs 中区分大小写的 setq 无效

通过 Hibernate 在 Linux 中区分 MySQL 大小写

LINQ to Entities 区分大小写比较

MS Access 中区分大小写的搜索