Не удается разрешить указанные входные столбцы, пока sql на датафрейме - PullRequest
0 голосов
/ 06 ноября 2018
  • Платформа: IntelliJ Edition 2018.2.4 (Community Edition)
  • SDK: 1.8.0_144
  • ОС: Windows 7

Будучи будущим выпускником, я выполняю свою первую миссию в области больших данных и сталкиваюсь с проблемой:

Код

//Loading my csv file here
val df = spark.read
  .format("csv")
  .option("header", "true")
  .option("delimiter",";")
  .load("/user/sfrtech/dilan/yesterdaycsv.csv")
  .toDF()


//Select required columns
val formatedDf = df.select("`TcRun.ID`", "`Td.Name`", "`TcRun.Startdate`", "`TcRun.EndDate`", "`O.Sim.MsisdnVoice`", "`T.Sim.MsisdnVoice`", "`ErrorCause`")

//Sql on DF in order to get useful data
formatedDf.createOrReplaceTempView("yesterday")
val sqlDF = spark.sql("" +
  " SELECT TcRun.Id, Td.Name, TcRun.Startdate, TcRun.EndDate, SUBSTR(O.Sim.MsisdnVoice,7,14) as MsisdnO, SUBSTR(T.Sim.MsisdnVoice,7,14) as MsisdnT", ErrorCause +
  " FROM yesterday" +
  " WHERE Td.Name like '%RING'" +
  " AND MsisdnO is not null" +
  " AND MsisdnT is not null" +
  " AND ErrorCause = 'NoError'")

Получение ошибки

Исключение в потоке "main" org.apache.spark.sql.AnalysisException: не может разрешить 'Td.Name' для указанных входных столбцов: [TcRun.EndDate, TcRun.Startdate, O.Sim.MsisdnVoice, TcRun.ID, Td .Name, T.Sim.MsisdnVoice, ErrorCause]; строка 1 поз 177;

Я полагаю, что проблема связана с именем моей колонки, содержащей "." но я не знаю, как решить эту проблему, даже если я использую backticks

Решение

val newColumns = Seq("id", "name", "startDate", "endDate", "msisdnO", "msisdnT", "error")
val dfRenamed = df.toDF(newColumns: _*)

dfRenamed.printSchema
// root
// |-- id: string (nullable = false)
// |-- name: string (nullable = false)
// |-- startDate: string (nullable = false)
// |-- endDate: string(nullable = false)
// |-- msisdnO: string (nullable = false)
// |-- msisdnT: string (nullable = false)
// |-- error: string (nullable = false)

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Это сработало,

val sqlDF = spark.sql("" +
  " SELECT 'TcRun.Id', 'Td.Name', 'TcRun.Startdate', 'TcRun.EndDate'", ErrorCause +
  " FROM yesterday" +
  " WHERE 'Td.Name' like '%RING'" +
  " AND MsisdnO is not null" +
  " AND MsisdnT is not null" +
  " AND ErrorCause = 'NoError'")

Если в имени поля есть символ ., используйте кавычки в предложении select.

0 голосов
/ 15 июля 2019

Для имени столбца, который содержит. (Точка), вы можете использовать символ `, чтобы заключить имя столбца.

df.select ('Td.Name')

Я столкнулся с подобной проблемой, и это решение сработало для меня.

Referance: Имена столбцов DataFrame конфликтуют с. (Точка)

0 голосов
/ 06 ноября 2018
// Define column names of csv without "."
val schema = StructType(Array(
        StructField("id", StringType, true),
        StructField("name", StringType, true),
        // etc. etc. )

// Load csv file without headers and specify your schema
val df = spark.read
  .format("csv")
  .option("header", "false")
  .option("delimiter",";")
  .schema(schema)
  .load("/user/sfrtech/dilan/yesterdaycsv.csv")
  .toDF()

Затем выберите желаемые столбцы

df
  .select ($"id", $"name", /*etc etc*/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...