Spark 中区分大小写的连接
Posted
技术标签:
【中文标题】Spark 中区分大小写的连接【英文标题】:Case sensitive join in Spark 【发布时间】:2021-09-15 14:00:15 【问题描述】:我正在处理一个需要编写区分大小写的连接条件的场景。为此,我发现有一个可以更改的 spark 配置属性 spark.sql.caseSensitive
。但是,如果我将此属性设置为True
或False
,对最终结果集没有影响。
在这两种方式中,我都没有从下面的示例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】:
我对@987654321@的理解是它影响的是SQL,而不是数据。
至于您的联接本身,如果您不想小写或大写您的数据,我可以理解为什么,您可以创建一个key
列,这是您要加入的值的小写版本。如果您遇到更复杂的情况,您的key
列甚至可以成为一个/多个列的md5()
。确保所有内容都保持小写/大写,以便进行比较。
【讨论】:
同意。在这种情况下, md5() 将是更好的方法。但是,是否有任何标准属性可用于更改连接条件区分大小写?我们可以在 SQL Server 连接中给出类似“COLLATE Latin1_General_100_CS_AS”的提示。 我讨厌法语中讨厌的排序规则:)。排序规则不应该影响您的加入,编码可以,但我很确定如果您使用正确的代码集摄取,Spark 会摆脱特定的编码。以上是关于Spark 中区分大小写的连接的主要内容,如果未能解决你的问题,请参考以下文章
导航栏在 Visual Studio 2017 中区分大小写