Scala - string with parameters parsing error

User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Scala - string with parameters parsing error

Post by Сабина »

Не пойму в чем проблема ? Возможно мои ограниченные познания в Scala

Есть вот такой пример с кодом который якобы работает

https://blog.knoldus.com/2017/06/02/dea ... -redshift/

Когда я запускаю свой вариант - все грустно падает в джавовском форматтере.
В частности вит в этой строке
val deltaQuery = postActionsQuery.format(targetTable, sourceTable, stagingTable)
Не пойму как такое может быть что у автора работает с "$", а у меня нет ?

Code: Select all

  def writeIntoTable(sourceDF: DataFrame, jdbcURL: String, tempS3Dir: String, targetTable: String): Unit = {
    val stagingTable = s"{targetTable}Staging"
    //println(stagingTable.toString)
    val sourceTable = s"{targetTable}Source"
    //println(sourceTable.toString)
    val insertUpdatedRecordsInStaging = """Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash;"""
    //println(insertUpdatedRecordsInStaging.toString)
    val insertUpdatedRecordsInTarget =
      """Delete from %1$s using %3$s where %1$s.hash = %3$s.hash;
        |Insert into %1$s Select * from %3$s;""".stripMargin
    //println(insertUpdatedRecordsInTarget.toString)
    val insertNewRecordsInTarget =
      """Delete from %2$s using %1$s where %2$s.hash = %1$s.hash;
        |Insert into %1$s Select * from %2$s;""".stripMargin
    //println(insertNewRecordsInTarget.toString)
    val postActionsQuery = s"""${insertUpdatedRecordsInStaging}begin transaction;${insertUpdatedRecordsInTarget} ${insertNewRecordsInTarget}end transaction;DROP tables $sourceTable,$stagingTable;"""
    println(postActionsQuery)
    val deltaQuery = postActionsQuery.format(targetTable, sourceTable, stagingTable)
2017-10-27 13:20:26,755 INFO [main] - (o.a.s.sql.execution.SparkSqlParser:54) - Parsing command: jobInstanceId as job_instance_id
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '$'
Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash;begin transaction;Delete from %1$s using %3$s where %1$s.hash = %3$s.hash;
at java.util.Formatter.checkText(Formatter.java:2579)
at java.util.Formatter.parse(Formatter.java:2555)
Insert into %1$s Select * from %3$s; Delete from %2$s using %1$s where %2$s.hash = %1$s.hash;
at java.util.Formatter.format(Formatter.java:2501)
at java.util.Formatter.format(Formatter.java:2455)
Insert into %1$s Select * from %2$s;end transaction;DROP tables {targetTable}Source,{targetTable}Staging;
at java.lang.String.format(String.java:2940)
at scala.collection.immutable.StringLike$class.format(StringLike.scala:318)
at scala.collection.immutable.StringOps.format(StringOps.scala:29)
at ......spark.redshift.RedshiftMergeTest$.writeIntoTable(RedshiftMergeTest.scala:111)
at ......spark.redshift.RedshiftMergeTest$.main(RedshiftMergeTest.scala:76)
at .......spark.redshift.RedshiftMergeTest.main(RedshiftMergeTest.scala)
https://www.youtube.com/watch?v=wOwblaKmyVw
anarchist
Уже с Приветом
Posts: 1868
Joined: 28 Dec 2014 18:20

Re: Scala - string with parameters parsing error

Post by anarchist »

Блин, как ее эту Скалу вообще читать, одни спец символы. Что реально должно быть по 3 штуки двойных квотов? За такой синтаксис языка убить мало.
Vox populi vox Dei
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: Scala - string with parameters parsing error

Post by Сабина »

:shock:
anarchist wrote: 27 Oct 2017 22:25 Блин, как ее эту Скалу вообще читать, одни спец символы. Что реально должно быть по 3 штуки двойных квотов? За такой синтаксис языка убить мало.
ну это отдельный разговор :).
дайте мне сначала понять почему автор счел нужным зафигачить $, а java.util.formatter на нем эксепшен спецом выбрасывает :)
Версии библиотек всех участвующих сторон (java, spark, scala, spark redshift driver) меняла , но безуспешно
https://www.youtube.com/watch?v=wOwblaKmyVw
mskmel
Уже с Приветом
Posts: 947
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: Scala - string with parameters parsing error

Post by mskmel »

Бинарным поиском, чтобы понять на каком именно format string падает Вы пробовали?
anarchist
Уже с Приветом
Posts: 1868
Joined: 28 Dec 2014 18:20

Re: Scala - string with parameters parsing error

Post by anarchist »

Сабина wrote: 28 Oct 2017 02:08 :shock:
anarchist wrote: 27 Oct 2017 22:25 Блин, как ее эту Скалу вообще читать, одни спец символы. Что реально должно быть по 3 штуки двойных квотов? За такой синтаксис языка убить мало.
ну это отдельный разговор :).
дайте мне сначала понять почему автор счел нужным зафигачить $, а java.util.formatter на нем эксепшен спецом выбрасывает :)
Версии библиотек всех участвующих сторон (java, spark, scala, spark redshift driver) меняла , но безуспешно
Включить дебуг и пройти пошагово, по идее там где упадет будет по сурсу понятно почему. Или глянуть сразу на java.util.Formatter.checkText(Formatter.java:2579)
Vox populi vox Dei
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Re: Scala - string with parameters parsing error

Post by roadman »

Сабина wrote: 27 Oct 2017 21:23 Не пойму в чем проблема ? Возможно мои ограниченные познания в Scala

Есть вот такой пример с кодом который якобы работает

https://blog.knoldus.com/2017/06/02/dea ... -redshift/

Когда я запускаю свой вариант - все грустно падает в джавовском форматтере.
В частности вит в этой строке
val deltaQuery = postActionsQuery.format(targetTable, sourceTable, stagingTable)
Не пойму как такое может быть что у автора работает с "$", а у меня нет ?

Code: Select all

  def writeIntoTable(sourceDF: DataFrame, jdbcURL: String, tempS3Dir: String, targetTable: String): Unit = {
    val stagingTable = s"{targetTable}Staging"
    //println(stagingTable.toString)
    val sourceTable = s"{targetTable}Source"
    //println(sourceTable.toString)
    val insertUpdatedRecordsInStaging = """Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash;"""
    //println(insertUpdatedRecordsInStaging.toString)
    val insertUpdatedRecordsInTarget =
      """Delete from %1$s using %3$s where %1$s.hash = %3$s.hash;
        |Insert into %1$s Select * from %3$s;""".stripMargin
    //println(insertUpdatedRecordsInTarget.toString)
    val insertNewRecordsInTarget =
      """Delete from %2$s using %1$s where %2$s.hash = %1$s.hash;
        |Insert into %1$s Select * from %2$s;""".stripMargin
    //println(insertNewRecordsInTarget.toString)
    val postActionsQuery = s"""${insertUpdatedRecordsInStaging}begin transaction;${insertUpdatedRecordsInTarget} ${insertNewRecordsInTarget}end transaction;DROP tables $sourceTable,$stagingTable;"""
    println(postActionsQuery)
    val deltaQuery = postActionsQuery.format(targetTable, sourceTable, stagingTable)
2017-10-27 13:20:26,755 INFO [main] - (o.a.s.sql.execution.SparkSqlParser:54) - Parsing command: jobInstanceId as job_instance_id
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '$'
Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash;begin transaction;Delete from %1$s using %3$s where %1$s.hash = %3$s.hash;
at java.util.Formatter.checkText(Formatter.java:2579)
at java.util.Formatter.parse(Formatter.java:2555)
Insert into %1$s Select * from %3$s; Delete from %2$s using %1$s where %2$s.hash = %1$s.hash;
at java.util.Formatter.format(Formatter.java:2501)
at java.util.Formatter.format(Formatter.java:2455)
Insert into %1$s Select * from %2$s;end transaction;DROP tables {targetTable}Source,{targetTable}Staging;
at java.lang.String.format(String.java:2940)
at scala.collection.immutable.StringLike$class.format(StringLike.scala:318)
at scala.collection.immutable.StringOps.format(StringOps.scala:29)
at ......spark.redshift.RedshiftMergeTest$.writeIntoTable(RedshiftMergeTest.scala:111)
at ......spark.redshift.RedshiftMergeTest$.main(RedshiftMergeTest.scala:76)
at .......spark.redshift.RedshiftMergeTest.main(RedshiftMergeTest.scala)
В Скале ничего не понимаю, но если посмотреть на код незамыленнын взглядом, бросается в глаза:

Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash

может?

Insert into %3$s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: Scala - string with parameters parsing error

Post by Сабина »

anarchist wrote: 28 Oct 2017 22:31
Сабина wrote: 28 Oct 2017 02:08 :shock:
anarchist wrote: 27 Oct 2017 22:25 Блин, как ее эту Скалу вообще читать, одни спец символы. Что реально должно быть по 3 штуки двойных квотов? За такой синтаксис языка убить мало.
ну это отдельный разговор :).
дайте мне сначала понять почему автор счел нужным зафигачить $, а java.util.formatter на нем эксепшен спецом выбрасывает :)
Версии библиотек всех участвующих сторон (java, spark, scala, spark redshift driver) меняла , но безуспешно
Включить дебуг и пройти пошагово, по идее там где упадет будет по сурсу понятно почему. Или глянуть сразу на java.util.Formatter.checkText(Formatter.java:2579)
Это-то понятно. Непонятно почему у автора статье это работает, а у меня нет
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: Scala - string with parameters parsing error

Post by Сабина »

roadman wrote: 29 Oct 2017 09:20
В Скале ничего не понимаю, но если посмотреть на код незамыленнын взглядом, бросается в глаза:

Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash

может?

Insert into %3$s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash
Вот это уже теплее. Но вообще прикольная описка тогда будет :D
Ща попробую
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: Scala - string with parameters parsing error

Post by Сабина »

Сабина wrote: 30 Oct 2017 00:21
roadman wrote: 29 Oct 2017 09:20
В Скале ничего не понимаю, но если посмотреть на код незамыленнын взглядом, бросается в глаза:

Insert into %$3s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash

может?

Insert into %3$s Select %2$s.* from %2$s join %1$s on %1$s.hash = %2$s.hash
Вот это уже теплее. Но вообще прикольная описка тогда будет :D
Ща попробую
У вас глаз - алмаз :great:
Слона то я и не приметила :oops:
https://www.youtube.com/watch?v=wOwblaKmyVw

Return to “Вопросы и новости IT”