Scala 查找不同数组列的大小
我正在使用Scala和Spark创建数据帧。以下是我目前的代码:Scala 查找不同数组列的大小,scala,apache-spark,Scala,Apache Spark,我正在使用Scala和Spark创建数据帧。以下是我目前的代码: val df = transformedFlattenDF .groupBy($"market", $"city", $"carrier").agg(count("*").alias("count"), min($"bandwidth").alias("bandwidth"), first($"network").alias("network"), concat_ws(",", collect_list($"carrierCod
val df = transformedFlattenDF
.groupBy($"market", $"city", $"carrier").agg(count("*").alias("count"), min($"bandwidth").alias("bandwidth"), first($"network").alias("network"), concat_ws(",", collect_list($"carrierCode")).alias("carrierCode")).withColumn("carrierCode", split(($"carrierCode"), ",").cast("array<string>")).withColumn("Carrier Count", collect_set("carrierCode"))
我想创建一个列来计算每个数组中不同值的数量。我尝试执行collect\u set
,但是,它给我一个错误,即分组表达式序列为空
是否可以在每行数组中找到不同值的数量?因此,在同一个示例中,可能会有这样一列:
Carrier Count
1: 2
2: 3
3: 2
collect\u set
用于聚合,因此应在您的groupBy agg
步骤中应用:
val df = transformedFlattenDF.groupBy($"market", $"city", $"carrier").agg(
count("*").alias("count"), min($"bandwidth").alias("bandwidth"),
first($"network").alias("network"),
concat_ws(",", collect_list($"carrierCode")).alias("carrierCode"),
size(collect_set($"carrierCode")).as("carrier_count") // <-- ADDED `collect_set`
).
withColumn("carrierCode", split(($"carrierCode"), ",").cast("array<string>"))
collect\u set
用于聚合,因此应在您的groupBy agg
步骤中应用:
val df = transformedFlattenDF.groupBy($"market", $"city", $"carrier").agg(
count("*").alias("count"), min($"bandwidth").alias("bandwidth"),
first($"network").alias("network"),
concat_ws(",", collect_list($"carrierCode")).alias("carrierCode"),
size(collect_set($"carrierCode")).as("carrier_count") // <-- ADDED `collect_set`
).
withColumn("carrierCode", split(($"carrierCode"), ",").cast("array<string>"))
不使用UDF,使用RDD转换,并为后代返回DF:
import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq(
("A", 2, 100, 2), ("F", 7, 100, 1), ("B", 10, 100, 100)
)).toDF("c1", "c2", "c3", "c4")
val x = df.select("c1", "c2", "c3", "c4").rdd.map(x => (x.get(0), List(x.get(1), x.get(2), x.get(3))) )
val y = x.map {case (k, vL) => (k, vL.toSet.size) }
// Manipulate back to your DF, via conversion, join, what not.
返回:
res15: Array[(Any, Int)] = Array((A,2), (F,3), (B,2))
如上所述,解决方案更好,对于后代来说更是如此。不使用UDF,使用RDD转换并返回DF,对于后代来说:
import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq(
("A", 2, 100, 2), ("F", 7, 100, 1), ("B", 10, 100, 100)
)).toDF("c1", "c2", "c3", "c4")
val x = df.select("c1", "c2", "c3", "c4").rdd.map(x => (x.get(0), List(x.get(1), x.get(2), x.get(3))) )
val y = x.map {case (k, vL) => (k, vL.toSet.size) }
// Manipulate back to your DF, via conversion, join, what not.
返回:
res15: Array[(Any, Int)] = Array((A,2), (F,3), (B,2))
上面的解决方案更好,正如所说的,对后代来说更是如此。您可以为udf寻求帮助,您可以这样做
//Input
df.show
+-----------+
|CarrierCode|
+-----------+
|1:[12,2,12]|
| 2:[5,2,8]|
| 3:[1,1,3]|
+-----------+
//udf
val countUDF=udf{(str:String)=>val strArr=str.split(":"); strArr(0)+":"+strArr(1).split(",").distinct.length.toString}
df.withColumn("Carrier Count",countUDF(col("CarrierCode"))).show
//Sample Output:
+-----------+-------------+
|CarrierCode|Carrier Count|
+-----------+-------------+
|1:[12,2,12]| 1:3|
| 2:[5,2,8]| 2:3|
| 3:[1,1,3]| 3:3|
+-----------+-------------+
你可以接受udf的帮助,你可以这样做
//Input
df.show
+-----------+
|CarrierCode|
+-----------+
|1:[12,2,12]|
| 2:[5,2,8]|
| 3:[1,1,3]|
+-----------+
//udf
val countUDF=udf{(str:String)=>val strArr=str.split(":"); strArr(0)+":"+strArr(1).split(",").distinct.length.toString}
df.withColumn("Carrier Count",countUDF(col("CarrierCode"))).show
//Sample Output:
+-----------+-------------+
|CarrierCode|Carrier Count|
+-----------+-------------+
|1:[12,2,12]| 1:3|
| 2:[5,2,8]| 2:3|
| 3:[1,1,3]| 3:3|
+-----------+-------------+
您能为TransformedFlatteDF提供模式和样本数据吗?您能为TransformedFlatteDF提供模式和样本数据吗?如果您为数据框架提供模式和样本输入,那么我可以更好地帮助您。如果您为数据框架提供模式和样本输入,那么我可以更好地帮助您。您好,谢谢您的解决方案!您的第二个示例有效,但第一个示例恐怕不起作用,因为最初这些数据是数组的数组。我把它做成一个字符串,然后用“,”连接起来,然后再用“,”(我没有显示第一个连接,因为我想提出一个简单的问题)。知道这些信息后,是否可以创建类似于您的第一个解决方案的内容?我不确定是否理解您描述的数据结构。我建议您使用更好地反映实际数据结构的示例数据以及特定的聚合需求来组合一个单独的问题。您好,谢谢您的解决方案!您的第二个示例有效,但第一个示例恐怕不起作用,因为最初这些数据是数组的数组。我把它做成一个字符串,然后用“,”连接起来,然后再用“,”(我没有显示第一个连接,因为我想提出一个简单的问题)。知道这些信息后,是否可以创建类似于您的第一个解决方案的内容?我不确定是否理解您描述的数据结构。我建议您使用更好地反映实际数据结构的示例数据以及特定的聚合需求来组合一个单独的问题。