【问题标题】:PySpark assigning name to column agg output [duplicate]PySpark为列agg输出分配名称[重复]
【发布时间】:2017-07-23 23:44:57
【问题描述】:

假设我有一个这样的数据框:

import pyspark
import pyspark.sql.functions as sf
import pyspark.sql.types as sparktypes
import datetime

sc = pyspark.SparkContext(appName="test")
sqlcontext = pyspark.SQLContext(sc)

rdd = sc.parallelize([('a',datetime.datetime(2014, 1, 9, 0, 0)),
                      ('b',datetime.datetime(2014, 1, 27, 0, 0)),
                      ('c',datetime.datetime(2014, 1, 31, 0, 0))])
testdf = sqlcontext.createDataFrame(rdd, ["id", "date"])

print(testdf.show())
print(testdf.printSchema())

给出一个测试数据框:

+---+--------------------+
| id|                date|
+---+--------------------+
|  a|2014-01-09 00:00:...|
|  b|2014-01-27 00:00:...|
|  c|2014-01-31 00:00:...|
+---+--------------------+


root
 |-- id: string (nullable = true)
 |-- date: timestamp (nullable = true)

我想获取日期列的最大值:

max_date = testdf.agg(sf.max(sf.col('date'))).collect()
print(max_date)

给出:

[Row(max(date)=datetime.datetime(2014, 1, 31, 0, 0))]

如何在原始操作本身中应用自定义名称以显示而不是自动分配max(date),例如max_date,以便我可以以max_date[0]['max_date'] 的形式访问值而不是max_date[0][0]max_date[0]['max(date)'],也是有没有更好的方法来访问这个值,Row() 的某些属性?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    你是这个意思吗?

    max_date = testdf.agg(sf.max(sf.col('date')).alias("newName")).collect()
    

    至于更好的访问方式。并不真地。 Collect 带来一个行列表,您需要告诉您需要哪一列,以便使用:

    max_date[0]['newName']
    

    你不能比这更短......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2013-08-02
      相关资源
      最近更新 更多