Apache spark 动态定义结构的列值
我有两个嵌套数组,一个是字符串,另一个是浮点数。我想基本上压缩这个,每行有一个(value,var)组合。我试着只使用一个数据帧,而不必求助于RDD或UDF,因为我认为这样会更干净、更快 我可以将每行的值、变量数组转换为每行1个值、变量的结构,但由于数组大小不同,我必须在不同的范围内运行数组理解。所以我想我可以在一列中指定长度并使用它。但是因为我会使用一个列,所以这是一个语法错误。关于如何使用列动态构建这样的结构(如果可能,不使用rdd/udf)的任何建议Apache spark 动态定义结构的列值,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我有两个嵌套数组,一个是字符串,另一个是浮点数。我想基本上压缩这个,每行有一个(value,var)组合。我试着只使用一个数据帧,而不必求助于RDD或UDF,因为我认为这样会更干净、更快 我可以将每行的值、变量数组转换为每行1个值、变量的结构,但由于数组大小不同,我必须在不同的范围内运行数组理解。所以我想我可以在一列中指定长度并使用它。但是因为我会使用一个列,所以这是一个语法错误。关于如何使用列动态构建这样的结构(如果可能,不使用rdd/udf)的任何建议 从pyspark.sql.functi
从pyspark.sql.functions导入列、数组、结构、分解
DF1=spark.createDataFrame([([“a”、“b”、“c”、“d”、“e”、“f”],[1,2,3,4,5,6],6),
([“g”],[7],1),
([“a”、“b”、“g”、“c”],[4,5,3,6],4),
([“c”,“d”],[2,3],2),
([“a”、“b”、“c”],[5,7,2],3)],
[“变量”、“VAL”、“num_元素”])
DF1.show()
arrayofstructs=数组(*[struct](
DF1.vars[c].别名(“变量”),
DF1.vals[c].别名(“值”)
#)对于DF1.num_elements])#中的c,您可以尝试以下方法:
从pyspark.sql.functions导入col、lit、posexplode、expr、split
(DF1
.select(“*”,posexplode(拆分(expr(“repeat(“'uu',num'u elements-1)”),'uu'))
.选择(列(“变量”).getItem(列(“位置”)、列(“VAL”).getItem(列(“位置”))
.show())
# +---------+---------+
#| vars[pos]| VAL[pos]|
# +---------+---------+
#| a | 1|
#| b | 2|
#| c | 3|
#| d | 4|
#| e | 5|
#| f | 6|
#| g | 7|
#| a | 4|
#| b | 5|
#| g | 3|
#| c | 6|
#| c | 2|
#| d | 3|
#| a | 5|
#| b | 7|
#| c | 2|
# +---------+---------+
但它绝不是“更干净、更快”。我个人会使用RDD
:
(DF1.rdd
.flatMap(lambda行:((val,var)表示val,zip中的var(row.vals,row.vars)))
.toDF([“val”,“var”])
.show())
# +---+---+
#| val | var|
# +---+---+
#| 1 | a|
#| 2 | b|
#| 3 | c|
#| 4 | d|
#| 5 | e|
#| 6 | f|
#| 7 | g|
#| 4 | a|
#| 5 | b|
#| 3 | g|
#| 6 | c|
#| 2 | c|
#| 3 | d|
#| 5 | a|
#| 7 | b|
#| 2 | c|
# +---+---+
但是,udf
也会起作用。非常感谢您的回复。在第一种方法中-。在第二种方法中选择(“*”,col(“vars”).getItem(col(“pos”)),col(“vals”).getItem(col(“pos”))
。平面图(lambda行:((row,val,var)表示val,var表示zip(row.vals,row.vars))。toDF([“data”,“val”,“var”)
)。
from pyspark.sql.functions import col, array, struct, explode
DF1 = spark.createDataFrame([(["a", "b", "c", "d", "e", "f"], [1,2,3,4,5,6], 6),
(["g"], [7], 1),
(["a", "b", "g", "c"], [4,5,3,6], 4),
(["c", "d"], [2,3], 2),
(["a", "b", "c"], [5,7,2], 3)],
["vars", "vals", "num_elements"])
DF1.show()
arrayofstructs = array(*[struct(
DF1.vars[c].alias("variables"),
DF1.vals[c].alias("values")
#) for c in DF1.num_elements]) # <- DOES NOT WORK
) for c in range(10)]) # <- FIXED SIZE DOES WORK
DF2 = DF1.withColumn("new", explode(arrayofstructs))
DF2.show()
DF3 = DF2.filter(DF2.new.variables.isNotNull())
DF3.show()
+------------------+------------------+------------+
| vars| vals|num_elements|
+------------------+------------------+------------+
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|
| [g]| [7]| 1|
| [a, b, g, c]| [4, 5, 3, 6]| 4|
| [c, d]| [2, 3]| 2|
| [a, b, c]| [5, 7, 2]| 3|
+------------------+------------------+------------+
+------------------+------------------+------------+------+
| vars| vals|num_elements| new|
+------------------+------------------+------------+------+
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[a, 1]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[b, 2]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[c, 3]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[d, 4]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[e, 5]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[f, 6]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6| [,]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6| [,]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6| [,]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6| [,]|
| [g]| [7]| 1|[g, 7]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
| [g]| [7]| 1| [,]|
+------------------+------------------+------------+------+
only showing top 20 rows
+------------------+------------------+------------+------+
| vars| vals|num_elements| new|
+------------------+------------------+------------+------+
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[a, 1]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[b, 2]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[c, 3]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[d, 4]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[e, 5]|
|[a, b, c, d, e, f]|[1, 2, 3, 4, 5, 6]| 6|[f, 6]|
| [g]| [7]| 1|[g, 7]|
| [a, b, g, c]| [4, 5, 3, 6]| 4|[a, 4]|
| [a, b, g, c]| [4, 5, 3, 6]| 4|[b, 5]|
| [a, b, g, c]| [4, 5, 3, 6]| 4|[g, 3]|
| [a, b, g, c]| [4, 5, 3, 6]| 4|[c, 6]|
| [c, d]| [2, 3]| 2|[c, 2]|
| [c, d]| [2, 3]| 2|[d, 3]|
| [a, b, c]| [5, 7, 2]| 3|[a, 5]|
| [a, b, c]| [5, 7, 2]| 3|[b, 7]|
| [a, b, c]| [5, 7, 2]| 3|[c, 2]|
+------------------+------------------+------------+------+