Добавить строку в пустой фрейм данных, используя spark scala - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь автоматизировать и загружать случайные данные в пустой фрейм данных, используя spark scala

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD

val df = spark.sql("select * from test.test")
val emptyDF= spark.createDataFrame(spark.sparkContext.emptyRDD[Row], df.schema)

Здесь я пытаюсь создать пустой фрейм данных со схемой тестовой таблицы.В данном случае это так (id int, name string).Я пытаюсь добавить пустую строку в этот фрейм данных.

val df2=Seq((1,2)).toDF("col1","col2")
emptyDF.union(df2)

Но если я изменю имя таблицы, мне придется делать эту операцию вручную в Seq (данные) и toDF (столбцы), я хочу изменить код так, чтобы данные можно было добавлять случайным образом иСхема должна выводиться из таблицы, например, как показано ниже

val columninfo = "\""+emptyDF.columns.mkString("\",\"")+"\""
val columncount = emptyDF.columns.size
val x = (1 to columncount).toList.mkString(",")

var df1=Seq(x).toDF(columninfo)

Но она не работает. Пожалуйста, дайте мне знать, если есть какой-либо способ добавить случайные данные в пустой кадр данных или как автоматизировать вышеуказанную операцию,или любой другой подход с подходит.Заранее спасибо

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете создать фиктивный DataFrame с одной записью (со значением, которое будет игнорироваться), и просто использовать select на этом DF со столбцами «пустого» DataFrame в качестве столбца names и с действующими целыми числами в качестве столбца значения :

import org.apache.spark.sql.functions._
import spark.implicits._

emptyDF.show()
// +----+----+
// |col1|col2|
// +----+----+
// +----+----+

List(1).toDF("dummy")
  .select(emptyDF.columns.zipWithIndex.map { case (name, value) => lit(value) as name }: _*)
  .show()
// +----+----+
// |col1|col2|
// +----+----+
// |   0|   1|
// +----+----+

ПРИМЕЧАНИЕ : предполагается, что все столбцы в emptyDF имеют тип Int.Если это предположение не может быть поддержано, вам понадобится более сложное решение, которое не просто использует emptyDf.columns (которые являются просто names ), но отображает emptyDf.schema.

Что касается вашей попытки:

  • Похоже, вы пытаетесь использовать код для написания кода ... в то время как это технически возможно (см .:макросы), это почти никогда не правильный подход, и он намного сложнее, чем просто передача аргументов String, которые содержат фрагменты кода в качестве аргументов для методов.
  • Также - вам не нужно union - выполнение union с пустым кадром данных бессмысленно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...