如何引用应用于连接条件中的列的别名聚合函数

时间:2017-03-23 22:26:05

标签: apache-spark pyspark

我正在将一个聚合函数(max)应用于一个列,然后我在一个连接中引用它。

该列在数据框中变为max(column_name)。因此,为了使用Python的点表示法更容易引用,我对该列别名,但我仍然收到错误:

tmp = hiveContext.sql("SELECT * FROM s3_data.nate_glossary WHERE profile_id_guid='ffaff64b-e87c-4a43-b593-b0e4bccc2731'"
                  )

max_processed = tmp.groupby('profile_id_guid','profile_version_id','record_type','scope','item_id','attribute_key') \
.agg(max("processed_date").alias("max_processed_date"))

df = max_processed.join(tmp, [max_processed.profile_id_guid == tmp.profile_id_guid,
                          max_processed.profile_version_id == tmp.profile_version_id,
                          max_processed.record_type == tmp.record_type,
                          max_processed.scope == tmp.scope,
                          max_processed.item_id == tmp.item_id,
                          max_processed.attribute_key == tmp.attribute_key,
                          max_processed.max_processed_date == tmp.processed_date])

错误:

  

文件“”,第7行,在文件中   “/usr/hdp/2.5.0.0-1245/spark/python/pyspark/sql/dataframe.py”,一行   650,在加入       jdf = self._jdf.join(other._jdf,on._jc,“inner”)文件“/usr/hdp/2.5.0.0-1245/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway py”为,   第813行,在调用文件中   “/usr/hdp/2.5.0.0-1245/spark/python/pyspark/sql/utils.py”,第51行,在   装饰       提升AnalysisException(s.split(':',1)[1],stackTrace)pyspark.sql.utils.AnalysisException:u'已解析的属性   processed_date#10缺少   RECORD_TYPE#41,范围#4,ITEM_ID#5,profile_id_guid#1,DATA_TYPE#44,ATTRIBUTE_VALUE#47,logical_id#45,profile_version_id#40,profile_version_id#2,attribute_key#8,max_processed_date#37,attribute_key#46,processed_date# 48,范围#42,RECORD_TYPE#3,#ITEM_ID 43,profile_id_guid#39,#ems_system_id 38   in operator!Join Inner,Some(((((((profile_id_guid#1 =   profile_id_guid#1)&& (profile_version_id#2 = profile_version_id#2))   &安培;&安培; (record_type#3 = record_type#3))&& (范围#4 =范围#4))&&   (item_id#5 = item_id#5))&& (attribute_key#8 = attribute_key#8))&&   (max_processed_date#37 = processed_date#10)));'

请注意错误消息:“processed_date#10 missing”。我在属性列表中看到了processed_date#48和processed_date#10。

1 个答案:

答案 0 :(得分:1)

请参阅:

# DataFrame transformation
tmp -> max_processed -> df

以上三个DataFrame共享相同的谱系,因此如果您想多次使用同一列,则需要使用alias

例如:

tmp = spark.createDataFrame([(1, 3, 1), (1, 3, 0), (2, 3, 1)], ['key1', 'key2', 'val'])

max_processed = tmp.groupBy(['key1', 'key2']).agg(f.max(tmp['val']).alias('max_val'))\
    .withColumnRenamed('key1', 'max_key1').withColumnRenamed('key2', 'max_key2')\

df = max_processed.join(tmp, on=[max_processed['max_key1'] == tmp['key1'],
                                 max_processed['max_key2'] == tmp['key2'],
                                 max_processed['max_val'] == tmp['val']])
df.show()

+--------+--------+-------+----+----+---+                                       
|max_key1|max_key2|max_val|key1|key2|val|
+--------+--------+-------+----+----+---+
|       1|       3|      1|   1|   3|  1|
|       2|       3|      1|   2|   3|  1|
+--------+--------+-------+----+----+---+

说实话,我仍然认为这是火花血统的缺陷