我正在将一个聚合函数(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。
答案 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|
+--------+--------+-------+----+----+---+
说实话,我仍然认为这是火花血统的缺陷