Python 透视Pyspark数据帧以获得多列
我的Pyspark数据框如下所示:Python 透视Pyspark数据帧以获得多列,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我的Pyspark数据框如下所示: +--------+----------+----+----+----+ |latitude| longitude|var1|date|var2| +--------+----------+----+----+----+ | 3.45| -8.65| 1| 7| 2| | 30.45| 45.65| 1| 7| 2| | 40.45| 123.65| 1| 7| 2| | 43.45|
+--------+----------+----+----+----+
|latitude| longitude|var1|date|var2|
+--------+----------+----+----+----+
| 3.45| -8.65| 1| 7| 2|
| 30.45| 45.65| 1| 7| 2|
| 40.45| 123.65| 1| 7| 2|
| 43.45| 13.65| 1| 7| 2|
| 44.45| -12.65| 1| 7| 2|
| 54.45| -128.65| 1| 7| 2|
+--------+----------+----+----+----+
但我不知道如何对它进行重新调整,以便只为每个日期获取一个寄存器,并以该顺序指定[variable,latitude,longitude],这样我就可以在一个单独的列中处理变量、latitude和longitude的每个组合
这样做:
df.select(
'date',
*[F.array(F.col(col), F.col('latitude'), F.col('longitude')) for col in var_cols]
).show()
我得到:
+----+---------------------------------+---------------------------------+
|date|array(var1, latitude, longitude) |array(var2, latitude, longitude) |
+----+---------------------------------+---------------------------------+
| 7| [1.0, 3.45, -8.65]| [2.0, 3.45, -8.65]|
| 7| [1.0, 30.45, 45.65]| [2.0, 30.45, 45.65]|
| 7| [1.0, 40.45, 123.65]| [2.0, 40.45, 123.65]|
| 7| [1.0, 43.45, 13.65]| [2.0, 43.45, 13.65]|
| 7| [1.0, 44.45, -12.65]| [2.0, 44.45, -12.65]|
| 7| [1.0, 54.45, -128...| [2.0, 54.45, -128...|
+----+---------------------------------+---------------------------------+
我想要一个包含单个值(var的值)的列,以及一个由纬度和经度的每个值组成的列。想象一下,在熊猫中建立[日期、纬度、经度]索引,然后拆下纬度和经度列
例如,在熊猫中,我会这样做:
df.set_index(["date", "latitude", "longitude"]).unstack().unstack()
这个怎么样:
var_cols = [col for col in df.columns if col not in ['date', 'latitude', 'longitude']]
df.withColumn('latlong',
F.concat_ws('_', F.col('latitude'), F.col('longitude'))) \
.groupBy('date') \
.pivot('latlong') \
.agg(*[F.first(col) for col in var_cols])
我遇到了这个解决方案:
var_cols = [col for col in df.columns if col not in ['date', 'latitude', 'longitude']]
df = df.withColumn('latlong',F.array(F.col('latitude'), F.col('longitude')))
df = df.withColumn('latlong', F.concat_ws(',', 'latlong'))
df = df.groupBy(["date"]).pivot("latlong").max(*var_cols)
您希望如何处理这两个变量?[var1,lat,long],[var2,lat,long]或[var1,var2,lat,long]?[var1,lat,long],[var2,lat,long]way@mck需要3列,date,[v1,l,l],[v2,l,l]?这就是@mck。旋转“latlong”会返回一个错误:Py4JJavaError:调用o955.pivot时出错:java.lang.RuntimeException:org.apache.spark.sql.catalyst.expressions.literal$.apply(literals.scala:78)org.apache.spark.sql.RelationalGroupedDataset$$anonfun$pivot$1.apply(RelationalGroupedDataset.scala:419)上不支持的文本类型类scala.collection.mutable.WrappedArray$ofRef-WrappedArray(3.45,-.8.65)在org.apache.spark.sql.RelationalGroupedDataset$$anonfun$pivot$1.apply(RelationalGroupedDataset.scala:419)上,您使用的spark版本是什么?这在Spark 3.0.0上对我很有效。我猜你用的是Spark 2,就是这样。我用的是Spark2@mck你能发现这个解决方案有什么问题吗?日期、纬度和经度的组合应该是唯一的,因此最大聚合函数应该可以正常工作。在效率方面有什么改进吗?我觉得不错,但这两条线可以合并成一条。我会更新我的答案