- Платформа: 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)