Spark DataFrame 在所有列上都是唯一的
Posted
技术标签:
【中文标题】Spark DataFrame 在所有列上都是唯一的【英文标题】:Spark DataFrame Unique On All Columns Individually 【发布时间】:2021-11-05 10:36:08 【问题描述】:我想用 Spark SQL 和 DataFrame 复制 Pandas nunique 函数。我有以下内容:
%spark
import org.apache.spark.sql.functions.countDistinct
import org.apache.spark.sql.functions._
val df = spark.read
.format("csv")
.option("delimiter", ";")
.option("header", "true") //first line in file has headers
.load("target/youtube_videos.csv")
println("Distinct Count: " + df.distinct().count())
val df2 = df.select(countDistinct("likes"))
df2.show(false)
这有效并打印了喜欢列的唯一计数,如下所示:
Distinct Count: 109847
+---------------------+
|count(DISTINCT likes)|
+---------------------+
|27494 |
+---------------------+
如何在一个 SQL 中执行此操作,以便获得所有单独列的摘要?
【问题讨论】:
这能回答你的问题吗? Spark DataFrame: count distinct values of every column 【参考方案1】:您可以轻松地迭代 DataFrame 中的所有列并收集结果,否则您也可以将其转换为 DataFrame
import pyspark.sql.functions as F
data = "col1" : [np.random.randint(10) for x in range(1,10)],
"col2" : [np.random.randint(100) for x in range(1,10)]
mypd = pd.DataFrame(data)
sparkDF = sql.createDataFrame(mypd)
sparkDF.show()
+----+----+
|col1|col2|
+----+----+
| 4| 54|
| 2| 90|
| 4| 70|
| 4| 37|
| 7| 63|
| 8| 59|
| 0| 52|
| 2| 76|
| 7| 79|
+----+----+
迭代 DataFrame 列
sparkDF.select([F.countDistinct(F.col(c)).alias(c) for c in sparkDF.columns]).show()
+----+----+
|col1|col2|
+----+----+
| 5| 9|
+----+----+
【讨论】:
那个 F 来自一些隐式导入吗? @joesan 这是 Python。但是你应该能够在 Scala 中使用相同的策略。 @joesan- 更新了答案以包含导入语句,是的,同样可以与 scala 一起使用【参考方案2】:我能够得到我想要的结果,如下所示:
import org.apache.spark.sql.functions.countDistinct
import org.apache.spark.sql.functions.col
// Print the unique values for each column
df.select(df.columns.map(c => countDistinct(col(c)).alias(c)): _*).show(false)
上面的 sn-p 打印:
+-------------+----------+-----------+--------+-----------------+-----+-----+--------+--------+--------+--------------------+--------------------+--------------+
|channel_title|channel_id|video_title|video_id|video_upload_date|views|likes|dislikes|comments|age_days|likes_dislikes_ratio|comments_views_ratio|mean_views_day|
+-------------+----------+-----------+--------+-----------------+-----+-----+--------+--------+--------+--------------------+--------------------+--------------+
|127 |127 |108980 |109846 |109692 |86107|27494|5457 |7104 |5195 |69021 |100809 |109714 |
+-------------+----------+-----------+--------+-----------------+-----+-----+--------+--------+--------+--------------------+--------------------+--------------+
【讨论】:
以上是关于Spark DataFrame 在所有列上都是唯一的的主要内容,如果未能解决你的问题,请参考以下文章
Dataframe Spark Scala中的最后一个聚合函数
如何使用 Spark(Java)在数据集的所有列上并行应用相同的函数