Apache spark 搜索';适当情况下';并使用Pyspark将其标记为无效

Apache spark 搜索';适当情况下';并使用Pyspark将其标记为无效,apache-spark,pyspark,apache-spark-sql,data-cleaning,Apache Spark,Pyspark,Apache Spark Sql,Data Cleaning,我有一个包含多个列的大数据集。下面是数据框示例,这里的“first”列包含我想检查的名称是否为正确的大小写?像aamir应该是aamir和aamir malik应该是aamir malik 我想要下面这样的东西 我使用Pyspark和下面的代码,在那里我得到了正确的答案,但我想先检测它,然后进行更改 在这里,我添加了一个新的列“correct”,并执行了函数。 name\u check\u 1=name\u check.withColumn(“correct”、initcap(col(“fi

我有一个包含多个列的大数据集。下面是数据框示例,这里的“first”列包含我想检查的名称是否为正确的大小写?像aamir应该是aamiraamir malik应该是aamir malik

我想要下面这样的东西

我使用Pyspark和下面的代码,在那里我得到了正确的答案,但我想先检测它,然后进行更改

在这里,我添加了一个新的列“correct”,并执行了函数。
name\u check\u 1=name\u check.withColumn(“correct”、initcap(col(“first”))

然后比较正确的列和第一列,这样它就给出了不正确的案例名称。
name\u check\u 2=name\u check\u 1.过滤器('correct!=first')

我需要一个方法来得到不适当的情况下,首先,然后纠正

我的解决方案如下:

逻辑:将字符串切成第一个字母,如果相等,则使用正确的字符串进行检查,否则无效。将大写字母设置为firstname和lastname的第一个字母表,其余字母设置为小写字母并连接。仅选择相关列

from pyspark.sql.functions import *
from pyspark.sql.types import *
values = [
(1,"aamir"),
(2,"Aamir"),
(3,"atif"),
(4,"Atif"),
(5,"tahir"),
(6,"sameer"),
(7,"ifzaan"),
(8,"Ifzaan"),
(9,"Saquib"),
(10,"aamir malik"),
(11,"adcA")


]
rdd = sc.parallelize(values)
schema = StructType([
    StructField("IDs", IntegerType(), True),
    StructField("first", StringType(), True)
])
#create dataframe 
data = spark.createDataFrame(rdd, schema)

#split first column into firstname and lastname
data = data.withColumn("firstname", split(data["first"]," ")[0]).withColumn("lastname", split(data["first"]," ")[1])

data = data \
        .withColumn("flag", when((trim(substring(data["firstname"],0,1)) == upper(trim(substring(data["firstname"],0,1)))) | 
                    (trim(substring(data["lastname"],0,1)) == upper(trim(substring(data["lastname"],0,1)))), lit("valid")).otherwise(lit("invalid"))) \
        .withColumn("correct" , concat(concat(upper(trim(substring(data["firstname"],0,1))), trim(lower(substring(data["firstname"],2,1000)))),lit(" "),
                                       when(data["lastname"].isNull(),lit("")) \
        .otherwise(concat(upper(trim(substring(data["lastname"],0,1))),trim(lower(substring(data["lastname"],2,1000))))))) \
        .select("IDs","first","flag","correct")

data.show()
#Result

+---+-----------+-------+-----------+
|IDs|      first|   flag|    correct|
+---+-----------+-------+-----------+
|  1|      aamir|invalid|     Aamir |
|  2|      Aamir|  valid|     Aamir |
|  3|       atif|invalid|      Atif |
|  4|       Atif|  valid|      Atif |
|  5|      tahir|invalid|     Tahir |
|  6|     sameer|invalid|    Sameer |
|  7|     ifzaan|invalid|    Ifzaan |
|  8|     Ifzaan|  valid|    Ifzaan |
|  9|     Saquib|  valid|    Saquib |
| 10|aamir malik|invalid|Aamir Malik|
| 11|       adcA|invalid|      Adca |
+---+-----------+-------+-----------+
我的解决方案如下:

逻辑:将字符串切成第一个字母,如果相等,则使用正确的字符串进行检查,否则无效。将大写字母设置为firstname和lastname的第一个字母表,其余字母设置为小写字母并连接。仅选择相关列

from pyspark.sql.functions import *
from pyspark.sql.types import *
values = [
(1,"aamir"),
(2,"Aamir"),
(3,"atif"),
(4,"Atif"),
(5,"tahir"),
(6,"sameer"),
(7,"ifzaan"),
(8,"Ifzaan"),
(9,"Saquib"),
(10,"aamir malik"),
(11,"adcA")


]
rdd = sc.parallelize(values)
schema = StructType([
    StructField("IDs", IntegerType(), True),
    StructField("first", StringType(), True)
])
#create dataframe 
data = spark.createDataFrame(rdd, schema)

#split first column into firstname and lastname
data = data.withColumn("firstname", split(data["first"]," ")[0]).withColumn("lastname", split(data["first"]," ")[1])

data = data \
        .withColumn("flag", when((trim(substring(data["firstname"],0,1)) == upper(trim(substring(data["firstname"],0,1)))) | 
                    (trim(substring(data["lastname"],0,1)) == upper(trim(substring(data["lastname"],0,1)))), lit("valid")).otherwise(lit("invalid"))) \
        .withColumn("correct" , concat(concat(upper(trim(substring(data["firstname"],0,1))), trim(lower(substring(data["firstname"],2,1000)))),lit(" "),
                                       when(data["lastname"].isNull(),lit("")) \
        .otherwise(concat(upper(trim(substring(data["lastname"],0,1))),trim(lower(substring(data["lastname"],2,1000))))))) \
        .select("IDs","first","flag","correct")

data.show()
#Result

+---+-----------+-------+-----------+
|IDs|      first|   flag|    correct|
+---+-----------+-------+-----------+
|  1|      aamir|invalid|     Aamir |
|  2|      Aamir|  valid|     Aamir |
|  3|       atif|invalid|      Atif |
|  4|       Atif|  valid|      Atif |
|  5|      tahir|invalid|     Tahir |
|  6|     sameer|invalid|    Sameer |
|  7|     ifzaan|invalid|    Ifzaan |
|  8|     Ifzaan|  valid|    Ifzaan |
|  9|     Saquib|  valid|    Saquib |
| 10|aamir malik|invalid|Aamir Malik|
| 11|       adcA|invalid|      Adca |
+---+-----------+-------+-----------+

您知道如何使用
initcap
,因此只需创建新列
correct
,并将其与列
first
进行比较,以检查其是否已经有效:

df.withColumn("correct", initcap(lower(col("first")))) \
  .withColumn("flag", when(col("correct") != col("first"), lit("invalid")).otherwise("valid")) \
  .show()
给出:

+---+-----------+-----------+-------+
| id|      first|    correct|   flag|
+---+-----------+-----------+-------+
|  1|      aamir|      Aamir|invalid|
|  2|      Aamir|      Aamir|  valid|
|  3|       atif|       Atif|invalid|
|  4|       Atif|       Atif|  valid|
|  5|      tahir|      Tahir|invalid|
|  6|     sameer|     Sameer|invalid|
|  7|     ifzaan|     Ifzaan|invalid|
|  8|Ifzaan Abcd|Ifzaan Abcd|  valid|
|  9|Saquib abcd|Saquib Abcd|invalid|
+---+-----------+-----------+-------+

您知道如何使用
initcap
,因此只需创建新列
correct
,并将其与列
first
进行比较,以检查其是否已经有效:

df.withColumn("correct", initcap(lower(col("first")))) \
  .withColumn("flag", when(col("correct") != col("first"), lit("invalid")).otherwise("valid")) \
  .show()
给出:

+---+-----------+-----------+-------+
| id|      first|    correct|   flag|
+---+-----------+-----------+-------+
|  1|      aamir|      Aamir|invalid|
|  2|      Aamir|      Aamir|  valid|
|  3|       atif|       Atif|invalid|
|  4|       Atif|       Atif|  valid|
|  5|      tahir|      Tahir|invalid|
|  6|     sameer|     Sameer|invalid|
|  7|     ifzaan|     Ifzaan|invalid|
|  8|Ifzaan Abcd|Ifzaan Abcd|  valid|
|  9|Saquib abcd|Saquib Abcd|invalid|
+---+-----------+-----------+-------+

你好,曼尼什,谢谢你的回答,我是它与我的数据在同一时间,你可以请添加一些评论,在你的代码,以便正确理解它。兄弟使用你的代码adcA输出是adcA,这是不正确的情况下,甚至阿米尔马利克显示阿米尔马利基将修复它的姓氏,代码只写的名字。你能解释一下adcA的输出应该是怎样的吗?我的意思是什么是合适的情况。adcA意味着每个单词都应该有第一个大写字母,而另一个是小的,如果一个人的名字中有空格,那么在空格之后再加一个大写字母,而其他的都是小的。这是一种更长、效率更低的方法。正确的方法应该是使用initcap的内置函数。你好,曼尼什,谢谢你的回答,我是它与我的数据在同一时间,你可以请添加一些评论,在你的代码,以便正确理解它。兄弟使用你的代码adcA输出是adcA,这是不正确的情况下,甚至阿米尔马利克显示阿米尔马利基将修复它的姓氏,代码只写的名字。你能解释一下adcA的输出应该是怎样的吗?我的意思是什么是合适的情况。adcA意味着每个单词都应该有第一个大写字母,而另一个是小的,如果一个人的名字中有空格,那么在空格之后再加一个大写字母,而其他的都是小的。这是一种更长、效率更低的方法。正确的方法应该是使用initcap的内置函数。你的问题不合逻辑。。因为,“如果不将条目与正确的值进行比较,我们就无法‘检测’无效条目,因此从逻辑上讲,您必须首先形成‘正确’字段,然后只有您才能获得标志,没有其他方法”您的问题没有逻辑意义。。因为,“如果不将条目与正确的值进行比较,我们就无法‘检测’无效条目,因此从逻辑上讲,您必须首先形成‘正确’字段,然后只有您才能获得标志,没有其他方法”