pyspark 为什么Spark SQL需要在类似条件下使用双百分比符号?

sqserrrh  于 2022-12-11  发布在  Spark
关注(0)|答案(1)|浏览(120)

当我在Spark SQL中使用like条件时,似乎需要使用2%的符号%%
但是,我在Spark SQL文档中找不到任何相关文档。我很好奇为什么我的设置会导致这个要求。https://spark.apache.org/docs/3.3.0/sql-ref-syntax-qry-select-like.html
示例数据

产品表

| 标识符|产品类型|区域|位置|测量值|
| - -|- -|- -|- -|- -|
| 小行星43635665|橙子-血橙色|欧盟|法国铁路局|30.5分|
| 小行星7896|苹果奶奶史密斯|不适用|美国|16.0个|
| 小行星1231|有机华盛顿|不适用|CAN总线|第7.1条|
| 小行星678|橙子、脐橙|不适用|墨西哥|八十八点四|

import pyspark
from pyspark.sql import functions as F

APP_NAME = "Product: Fruit Template"
SPARK_CONF = [
    ("spark.dynamicAllocation.maxExecutors", "5"),
    ("spark.executor.memory", "10g"),
    ("spark.executor.cores", "4"),
    ("spark.executor.memoryOverhead", "2000"),
] 

spark_conf = pyspark.SparkConf()
spark_conf.setAppName(APP_NAME)
spark_conf.setAll(SPARK_CONF)

sc = pyspark.SparkContext(conf=spark_conf)
spark = pyspark.sql.SparkSession(sc)

def sql(query):
    return spark.sql(query)

df = sql("""
SELECT *
FROM product_table
""")

这返回数据

df.filter(F.col("product_type").like("ORANGE%%")).show()

而这将返回空 Dataframe

df.filter(F.col("product_type").like("ORANGE%")).show()

也许值得注意的是,在SQL字符串中使用LIKE条件时会发生同样的问题
这返回数据

df_new = sql("""
SELECT *
FROM product_table
WHERE product_type like 'ORANGE%%'
""")

df_new.show()

而这将返回空 Dataframe

df_new = sql("""
SELECT *
FROM product_table
WHERE product_type like 'ORANGE%'
""")

df_new.show()
lb3vh1jj

lb3vh1jj1#

我使用的是PySpark Version: 2.3.2

conf = (SparkConf()
    .set("spark.executor.instances", "24")
    .set("spark.executor.cores", "5")
    .set("spark.executor.memory", "33g")
    .set("spark.driver.memory", "55g")
    .set("spark.driver.maxResultSize", "10g")
    .set("spark.sql.catalogImplementation", "hive")
    .set("mapreduce.fileoutputcommitter.algorithm.version", "2")
)

spark = (
    SparkSession.builder.appName("default")
    .enableHiveSupport()
    .config(conf=conf)
    .getOrCreate()
)

df = spark.createDataFrame(
    [('43635665','ORANGE - Blood Orange'),
     ('78960788','APPLE GrannySmith'),
     ('12312343','APPLE [Organic Washington'),
     ('67867634','ORANGE, NavelOrange')],
    ['id', 'product_type'])

df.createOrReplaceTempView("product_table")

def sql(query):
    print(query)
    return spark.sql(query)

df2 = sql("""
SELECT *
FROM product_table
""")
df2.filter(F.col("product_type").like("ORANGE%")).show(truncate=False)

相关问题