Python 按日期分组spark数据帧

Python 按日期分组spark数据帧,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我已经从SQLServer表加载了一个数据帧。看起来是这样的: >>> df.show() +--------------------+----------+ | timestamp| Value | +--------------------+----------+ |2015-12-02 00:10:...| 652.8| |2015-12-02 00:20:...| 518.4| |2015-12-02 00:30:...|

我已经从SQLServer表加载了一个数据帧。看起来是这样的:

>>> df.show()
+--------------------+----------+
|           timestamp|    Value |
+--------------------+----------+
|2015-12-02 00:10:...|     652.8|
|2015-12-02 00:20:...|     518.4|
|2015-12-02 00:30:...|     524.6|
|2015-12-02 00:40:...|     382.9|
|2015-12-02 00:50:...|     461.6|
|2015-12-02 01:00:...|     476.6|
|2015-12-02 01:10:...|     472.6|
|2015-12-02 01:20:...|     353.0|
|2015-12-02 01:30:...|     407.9|
|2015-12-02 01:40:...|     475.9|
|2015-12-02 01:50:...|     513.2|
|2015-12-02 02:00:...|     569.0|
|2015-12-02 02:10:...|     711.4|
|2015-12-02 02:20:...|     457.6|
|2015-12-02 02:30:...|     392.0|
|2015-12-02 02:40:...|     459.5|
|2015-12-02 02:50:...|     560.2|
|2015-12-02 03:00:...|     252.9|
|2015-12-02 03:10:...|     228.7|
|2015-12-02 03:20:...|     312.2|
+--------------------+----------+
现在我想按小时(或天,或月或…)对值进行分组(和求和),但我真的不知道如何才能做到这一点

这就是我加载数据帧的方式。不过,我觉得这不是正确的方法:

query = """
SELECT column1 AS timestamp, column2 AS value
FROM table
WHERE  blahblah
"""

sc = SparkContext("local", 'test')
sqlctx = SQLContext(sc)

df = sqlctx.load(source="jdbc",
                 url="jdbc:sqlserver://<CONNECTION_DATA>",
                 dbtable="(%s) AS alias" % query)
query=”“”
选择column1作为时间戳,选择column2作为值
从桌子上
布拉布拉赫在哪里
"""
sc=SparkContext(“本地”,“测试”)
sqlctx=SQLContext(sc)
df=sqlctx.load(source=“jdbc”,
url=“jdbc:sqlserver://”,
dbtable=“(%s)作为别名”%query)

可以吗?

因为1.5.0 Spark提供了许多功能,如
月日
小时
,可以对日期和时间戳进行操作。因此,如果
时间戳
时间戳类型
,则只需要一个正确的表达式。例如:

from pyspark.sql.functions import hour, mean

(df
    .groupBy(hour("timestamp").alias("hour"))
    .agg(mean("value").alias("mean"))
    .show())

## +----+------------------+
## |hour|              mean|
## +----+------------------+
## |   0|508.05999999999995|
## |   1| 449.8666666666666|
## |   2| 524.9499999999999|
## |   3|264.59999999999997|
## +----+------------------+
在1.5.0之前,您的最佳选择是使用
HiveContext
和配置单元自定义项,或者使用
selectExpr

df.selectExpr("year(timestamp) AS year", "value").groupBy("year").sum()

## +----+---------+----------+   
## |year|SUM(year)|SUM(value)|
## +----+---------+----------+
## |2015|    40300|    9183.0|
## +----+---------+----------+
或原始SQL:

df.registerTempTable("df")

sqlContext.sql("""
    SELECT MONTH(timestamp) AS month, SUM(value) AS values_sum
    FROM df
    GROUP BY MONTH(timestamp)""")

请记住,聚合是由Spark执行的,而不是下推到外部源。通常这是一种理想的行为,但在某些情况下,您可能更愿意将聚合作为子查询来执行,以限制数据传输。

此外,您还可以使用date\u格式创建任意时间段。 分组具体日期:

从pyspark.sql导入函数为F
df.选择(F.date_格式('timestamp','yyyy-MM-dd')。别名('day'))。分组方式('day')。计数()。显示()
对于pyspark>=2.2:

from pyspark.sql.functions import to_date

df.groupBy(to_date('created_time').al)

他们今年有什么活动吗?