如何在Spark RDD中比较不区分大小写的字符串?

时间:2018-07-31 06:50:25

标签: python apache-spark pyspark

我有以下数据集

color = future

想从数据集上方找出A和B的数目以及标头。我正在使用以下代码找出A的数量和B的数量。

ggplot()+geom_point(data = delta, aes(x = dP/100, y = dT, z = NULL, color = rcp, shape = future))

返回的输出为drug_name,num_prescriber,total_cost AMBIEN,2,300 BENZTROPINE MESYLATE,1,1500 CHLORPROMAZINE,2,3000 。我想比较时不区分大小写。我已经尝试了以下操作,但返回的错误为from pyspark import SparkContext from pyspark.sql import SparkSession logFile = 'Sample.txt' spark = SparkSession.builder.appName('GD App').getOrCreate() logData = spark.read.text(logFile).cache() numAs = logData.filter(logData.value.contains('a')).count() numBs = logData.filter(logData.value.contains('b')).count() print('{0} {1}'.format(numAs,numBs))

1 1

请帮帮我。

1 个答案:

答案 0 :(得分:4)

要转换为小写,应使用lower()中的pyspark.sql.functions函数(请参阅here)。因此,您可以尝试:

import pyspark.sql.functions as F

logData = spark.createDataFrame(
    [
     (0,'aB'),
     (1,'AaA'),
     (2,'bA'),
     (3,'bB')
    ],
    ('id', "value")
)
numAs = logData.filter(F.lower((logData.value)).contains('a')).count()

您提到“我正在使用以下代码找出A的数量和B的数量。”请注意,如果要计算字符的实际出现次数而不是包含字符的行数,可以执行以下操作:

def count_char_in_col(col: str, char: str):
    return F.length(F.regexp_replace(F.lower(F.col(col)), "[^" + char + "]", ""))

logData.select(count_char_in_col('value','a')).groupBy().sum().collect()[0][0]

在上面的示例中它将返回5

希望这会有所帮助!