Pyspark создает несколько строк для записи, которые включают временной диапазон - PullRequest
0 голосов
/ 28 февраля 2019

У меня датафрейм выглядит следующим образом.

A  Start  End
1  1578   1581
1  1789   1790
2  1800   1802

начало и конец эпохи.И я хочу создавать несколько строк каждую секунду, как это

A  time
1  1578
1  1579
1  1580
1  1581
1  1789
1  1790
2  1800
2  1801
2  1802

Как это сделать в pyspark?(Не нужно хранить заказ)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Идея состоит в том, чтобы создать list, охватывающий весь промежуток времени, включая промежуточный seconds.Например,для Start = 1578 и End = 1581 мы создаем список [1578,1579,1580,1581].Чтобы создать этот список, мы сначала создаем UDF.Как только этот список получен, мы взрываем его, чтобы получить необходимое dataframe.

# Creating the DataFrame
values = [(1,1578,1581),(1,1789,1790),(2,1800,1802)]
df = sqlContext.createDataFrame(values,['A','Start','End'])
df.show()
+---+-----+----+
|  A|Start| End|
+---+-----+----+
|  1| 1578|1581|
|  1| 1789|1790|
|  2| 1800|1802|
+---+-----+----+

# Import requisite packages
from pyspark.sql.functions import udf, col, explode, array, struct
from pyspark.sql.types import ArrayType, StructType, StructField, IntegerType

#Creating UDFs below to create a list.
def make_list(start,end):
    return list(range(start,end+1))
make_list_udf = udf(make_list,ArrayType(IntegerType()))

#Creating Lists of seconds finally.
df = df.withColumn('my_list',make_list_udf(col('Start'),col('End'))).drop('Start','End')
df.show(truncate=False)
+---+------------------------+
|A  |my_list                 |
+---+------------------------+
|1  |[1578, 1579, 1580, 1581]|
|1  |[1789, 1790]            |
|2  |[1800, 1801, 1802]      |
+---+------------------------+

#Exploding the Lists
df = df.withColumn('time', explode('my_list')).drop('my_list')
df.show()
+---+----+
|  A|time|
+---+----+
|  1|1578|
|  1|1579|
|  1|1580|
|  1|1581|
|  1|1789|
|  1|1790|
|  2|1800|
|  2|1801|
|  2|1802|
+---+----+
0 голосов
/ 28 февраля 2019

Предполагая, что ваши данные находятся в кадре данных df и у вас есть вспомогательный кадр данных s_df с секундами, вы можете сделать:

df.alias("a").join(s_df.alias("b"), (col("a.Start") >= col("b.time)) & (col("a. End") <= col("b.time)), "inner").select(col("a.A"), col("b.time")).

Это может стать проблемой в случае наложения символов "A".В этом случае вы можете захотеть сделать «А» уникальным для установления эпохи, которой принадлежит

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