pyspark - добавление столбца из фрейма данных (df1) в другой фрейм данных (df2) - PullRequest
0 голосов
/ 25 октября 2019

нужна помощь с этой проблемой Apache Spark (pyspark) ..

У меня есть dataFrame (df1), который имеет один столбец и одну строку, он содержит max_timestamp

+------------------+ |max_timestamp | +-------------------+ |2019-10-24 21:18:26| +-------------------+

У меня есть еще один DataFrame, который содержит 2 столбца - EmpId & Timestamp

masterData = [(1, '1999-10-24 21:18:23',), (1, '2019-10-24 21:18:26',), (2, '2020-01-24 21:18:26',)]
df_masterdata = spark.createDataFrame(masterData, ['dsid', 'txnTime_str'])
df_masterdata = df_masterdata.withColumn('txnTime_ts', col('txnTime_str').cast(TimestampType())).drop('txnTime_str')

df_masterdata.show(5, False)

+----+-------------------+
|dsid|txnTime_ts         |
+----+-------------------+
|1   |1999-10-24 21:18:23|
|1   |2019-10-24 21:18:26|
|2   |2020-01-24 21:18:26|
+----+-------------------+

Объект предназначен для фильтрации записей во 2-м кадре данных на основе условия txnTime_ts

Что я пытаюсь сделать -> добавить столбец 'max_timestamp' во 2-й фрейм данных и отфильтровать записи, сравнив 2 значения.

df_masterdata1 = df_masterdata.withColumn('maxTime', maxTS2['TEMP_MAX'])

Pyspark не позволяет мне добавлять столбецот maxTS2 до dataFrame - df_masterdata

Ошибка -

AnalysisException: 'Resolved attribute(s) TEMP_MAX#207255 missing from dsid#207263L,txnTime_ts#207267 in operator
!Project [dsid#207263L, txnTime_ts#207267, TEMP_MAX#207255 AS maxTime#207280].;;\n!Project [dsid#207263L,
txnTime_ts#207267, TEMP_MAX#207255 AS maxTime#207280]\n+- Project [dsid#207263L, txnTime_ts#207267]\n   +- Project
[dsid#207263L, txnTime_str#207264, cast(txnTime_str#207264 as timestamp) AS txnTime_ts#207267]\n      +- LogicalRDD
[dsid#207263L, txnTime_str#207264], false\n'

Есть идеи, как решить эту проблему? Цените вашу помощь в этом.

1 Ответ

0 голосов
/ 25 октября 2019

Если на самом деле у вас есть DF с одной строкой / столбцом, наиболее эффективный способ сделать это - извлечь значение из фрейма данных и затем отфильтровать df_masterdata по нему. Если вам все же необходимо сделать это в контексте фрейма данных, вам следует использовать join, например:

df_masterdata1 = df_masterdata.join(df1, df_masterdata.txnTime_ts <= df1.max_timestamp)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...