С учетом регистра создать дубликат в фрейме данных, несмотря на Distinct в Spark Scala - PullRequest
1 голос
/ 01 августа 2020

Я использую Spark с scala 2.4.

spark.sqlContext.sql("set spark.sql.caseSensitive=false")
    spark.sql("select Distinct p.Area,c.Remarks from mytable c join areatable p on c.id=p.id where c.remarks = 'Sufficient Amounts'")

Я использовал Distinct даже тогда, когда я получаю 3 записи для каждой отдельной записи.

DISTRICT_1| Sufficient Amounts
District_1| Sufficient Amounts
district_1| Sufficient Amounts
DISTRICT_10|Sufficient Amounts
District_10|Sufficient Amounts
district_10|Sufficient Amounts

Даже если я установил явно spark.sqlContext.sql("set spark.sql.caseSensitive=false").

Ожидаемый результат:

DISTRICT_1  |Sufficient Amounts
DISTRICT_10 |Sufficient Amounts

Нужно ли мне что-то устанавливать. Пожалуйста, поделитесь своими мыслями.

1 Ответ

1 голос
/ 01 августа 2020

spark.sql.caseSensitive используется для без учета регистра имен столбцов (не для преобразования значений столбцов) вместо

  • Используйте window row_number () функция для этого случая.

Example:

df.show()

//+-----------+------------------+
//|       Area|           Remarks|
//+-----------+------------------+
//| DISTRICT_1|Sufficient Amounts|
//| District_1|Sufficient Amounts|
//| district_1|Sufficient Amounts|
//|DISTRICT_10|Sufficient Amounts|
//|District_10|Sufficient Amounts|
//|district_10|Sufficient Amounts|
//+-----------+------------------+

df.createOrReplaceTempView("mytable")

import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._

spark.sql("SET spark.sql.parser.quotedRegexColumnNames=true")

sql("select `(rn)?+.+` from (select *, row_number() over(partition by lower(Area) order by 1) as rn from mytable)q where q.rn =1").show()

//+-----------+------------------+
//|       Area|           Remarks|
//+-----------+------------------+
//| DISTRICT_1|Sufficient Amounts|
//|DISTRICT_10|Sufficient Amounts|
//+-----------+------------------+
...