Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 透视Pyspark数据帧以获得多列_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 透视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|

我的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|     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你能发现这个解决方案有什么问题吗?日期、纬度和经度的组合应该是唯一的,因此最大聚合函数应该可以正常工作。在效率方面有什么改进吗?我觉得不错,但这两条线可以合并成一条。我会更新我的答案