Dataframe 火花数据帧操作

Dataframe 火花数据帧操作,dataframe,apache-spark,apache-spark-sql,Dataframe,Apache Spark,Apache Spark Sql,我试图在我的数据帧上做一个非常具体的操作,但是我找不到一个好的方法 我有这样一个数据框: +------------------+----------------+--------+ |CIVILITY_PREDICTED|COUNTRY_CODE_PRE| name| +------------------+----------------+--------+ | M| CA|A HANNAN| |

我试图在我的数据帧上做一个非常具体的操作,但是我找不到一个好的方法

我有这样一个数据框:

+------------------+----------------+--------+
|CIVILITY_PREDICTED|COUNTRY_CODE_PRE|    name|
+------------------+----------------+--------+
|                 M|              CA|A HANNAN|
|                 M|              CA|   A JAY|
|                 M|              GB|   A JAY|
|                 M|              CA| A K I L|
|                 F|              CA|   A LAH|
|                 ?|              CN|  A LIAN|
|                 ?|              CN|   A MEI|
|                 ?|              CN|   A MIN|
|                 F|              CA|   A RIN|
|                 M|              CA|   A S M|
|                 ?|              CN|  A YING|
|                 F|              CA|AA ISHAH|
|                 M|              CA|   AABAN|
|                 M|              GB|   AABAN|
|                 M|              US|   AABAN|
|                 M|              GB|   AABAS|
|                 F|              CA|  AABEER|
|                 M|              CA|   AABEL|
|                 F|              US|   AABHA|
|                 F|              GB|   AABIA|
+------------------+----------------+--------+
正如你在《礼貌》中看到的,我有一些“?”。 每个“名字”在每个国家都有一行,有时你预测的文明程度是一个国家的“?”,而不是同一个国家的另一行

因此,基本上我想为每个“?”添加最常见的礼貌,根据其他国家的名称进行预测

我试着这样做(e是数据帧,to_predict是另一个只有我想要的名称的数据帧):

通过这个,我得到了每个名字出现次数最多的CIVLITY_预测值,但我想它不是很理想,我不知道如何用这个替换数据帧中相应的“?”


有人知道吗?非常感谢

窗口功能是这里的关键。以下解决方案使用first_值根据行数拾取第一个性别值

spark.sql("""select distinct name, first_value(CIVILITY_PREDICTED) over (partition by name order by count(*) desc) civility
             from civ
             group by name, CIVILITY_PREDICTED
             """).show
根据如下所示重新创建的数据,返回:

+-----+--------+
| name|civility|
+-----+--------+
|AABAN|       M|
+-----+--------+

要查看原始值以及最常见的值,请执行以下操作:

spark.sql("""select name, CIVILITY_PREDICTED, 
             first(CIVILITY_PREDICTED) 
              over (partition by name order by count(*) desc) civility
             from civ 
             group by 1,2 
             order by 1,2
             """).show
返回

+-----+------------------+--------+
| name|CIVILITY_PREDICTED|civility|
+-----+------------------+--------+
|AABAN|                 ?|       M|
|AABAN|                 M|       M|
+-----+------------------+--------+

我只重新创建了一个名称,其中包含您试图解决的问题。阿班是谁?一排是“M”,另外两排是“M”

val civ = """+------------------+----------------+--------+
|CIVILITY_PREDICTED|COUNTRY_CODE_PRE|    name|
+------------------+----------------+--------+
|                 ?|              CA|   AABAN|
|                 M|              GB|   AABAN|
|                 M|              US|   AABAN|""".stripMargin.replaceAll("\\+", "").replaceAll("\\-", "").split("\n").filter(_.size>10)

val df = spark.read
  .option("ignoreTrailingWhiteSpace", "true")
  .option("ignoreLeadingWhiteSpace", "true")
  .option("delimiter", "|")
  .option("header", "true")
  .csv(spark.sparkContext.parallelize(civ).toDS)
  .drop("_c3")

df.createOrReplaceTempView("civ")

df.orderBy("name").show(99)

+------------------+----------------+-----+
|CIVILITY_PREDICTED|COUNTRY_CODE_PRE| name|
+------------------+----------------+-----+
|                 ?|              CA|AABAN|
|                 M|              GB|AABAN|
|                 M|              US|AABAN|
+------------------+----------------+-----+


在您的示例中,我没有看到一个名称在一行中有
,在另一行中有不同值的示例。请修改数据以显示示例。还请显示输出应该是什么样子。
val civ = """+------------------+----------------+--------+
|CIVILITY_PREDICTED|COUNTRY_CODE_PRE|    name|
+------------------+----------------+--------+
|                 ?|              CA|   AABAN|
|                 M|              GB|   AABAN|
|                 M|              US|   AABAN|""".stripMargin.replaceAll("\\+", "").replaceAll("\\-", "").split("\n").filter(_.size>10)

val df = spark.read
  .option("ignoreTrailingWhiteSpace", "true")
  .option("ignoreLeadingWhiteSpace", "true")
  .option("delimiter", "|")
  .option("header", "true")
  .csv(spark.sparkContext.parallelize(civ).toDS)
  .drop("_c3")

df.createOrReplaceTempView("civ")

df.orderBy("name").show(99)

+------------------+----------------+-----+
|CIVILITY_PREDICTED|COUNTRY_CODE_PRE| name|
+------------------+----------------+-----+
|                 ?|              CA|AABAN|
|                 M|              GB|AABAN|
|                 M|              US|AABAN|
+------------------+----------------+-----+