Как сохранить схему спарк-данных в переменной в блокноте? - PullRequest
0 голосов
/ 11 октября 2019

с использованием искробезопасных лазурных блоков данных.

У меня есть кадр данных (df1) со 100+ столбцами. Мне нужно создать еще один dataframe (df2) и хочу иметь ту же схему для этого тоже. Как я могу сохранить схему df1 в переменной и применить к df2

val inputDF = Seq(("00163E0F765C1ED79593228BF70CEE41" ,"PD PUMPS")
                       ,("00164E0F775C1ED79593228BF70CEE42" ,"PD PUMPS")
                       ,("00165E0F785C1ED79593228BF70CEE43" ,"PD PUMPS")
                       ,("00166E0F795C1ED79593228BF70CEE44" ,"PD PUMPS")
                       ,("00167E0F405C1ED79593228BF70CEE45" ,"PD PUMPS")
                   ).toDF("objectID")
val expectedDF = Seq(("00163E0F765C1ED79593228BF70CEE41" ,"PD PUMPS1")
                       ,("00164E0F775C1ED79593228BF70CEE42" ,"PD PUMPS1")
                       ,("00165E0F785C1ED79593228BF70CEE43" ,"PD PUMPS1")
                       ,("00166E0F795C1ED79593228BF70CEE44" ,"PD PUMPS1")
                       ,("00167E0F405C1ED79593228BF70CEE45" ,"PD PUMPS1")
                       ).toDF("objectID","equipmentName", inputDF.schema)

Цель этого заключается в следующем: я на самом деле пишу тестовый блок. У меня есть одна функция, которая добавляет столбец в переданный массив данных (параметризованный). Поэтому мне нужно создать inputDF, а затем мне нужно создать ожидаемый DF с еще одним столбцом в inputDF.

1 Ответ

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

Учитывая, что для генерации inputDF вы должны использовать последовательность из одного столбца (или передать две строки в методе toDF), я бы сделал следующее:

val inputDF = Seq(("00163E0F765C1ED79593228BF70CEE41")
  ,("00164E0F775C1ED79593228BF70CEE42")
  ,("00165E0F785C1ED79593228BF70CEE43")
  ,("00166E0F795C1ED79593228BF70CEE44")
  ,("00167E0F405C1ED79593228BF70CEE45")
).toDF("objectID")

val seq = Seq(("00163E0F765C1ED79593228BF70CEE41" ,"PD PUMPS1")
  ,("00164E0F775C1ED79593228BF70CEE42" ,"PD PUMPS1")
  ,("00165E0F785C1ED79593228BF70CEE43" ,"PD PUMPS1")
  ,("00166E0F795C1ED79593228BF70CEE44" ,"PD PUMPS1")
  ,("00167E0F405C1ED79593228BF70CEE45" ,"PD PUMPS1")
)

val rdd = spark.sparkContext.parallelize(seq)

val rows: RDD[Row] = rdd.map((row: (String, String)) => {
  Row(row.productIterator.toList:_*)
})

val expectedDF = spark.createDataFrame(rows,
  inputDF.schema.add(StructField("NewColumn", org.apache.spark.sql.types.StringType )))

df.show()

Идея состоит в том, чтобы создатьКадр данных из последовательности с помощью createDataFrame и передать ему схему (т. Е. StructType) старого фрейма данных с добавлением одной записи (StructField).

...