Spark Parquet Writer настаивает на том, чтобы писать как BigDecimal независимо от внутренней и внешней схемы и приведения - PullRequest
0 голосов
/ 27 августа 2018

Я имею дело с данными, в которых есть некоторые поля с данными, подобными этим:

  123456789.00000

.. но для которых нам нужно рассматривать их как строки в выходном файле партера.

Проблема заключается в том, что программа чтения и записи Spark для паркетной машины выводит эти столбцы как BigDecimal.После значительного расследования я узнал, как справиться с чтением этих: к сожалению, необходимо сделать cast после факта ..

Но написание ?Я не нашел какого-либо способа справиться с этим.Внутренняя схема и поля уже установлены на String:

Здесь мы видим внутреннюю схему:

enter image description here

Но - просто чтобы быть уверенным - столбец srcRealmId явно приведен к String:

val outDf = matchedDf.withColumn("srcRealmId",$"srcRealmId".cast(StringType))

Теперь давайте рассмотрим выводсхема outDf:

enter image description here

Все поля являются строками.

Но это все еще терпит неудачу:

    8/08/26 16:00:52 WARN BlockManager: Putting block rdd_34_5 failed 
    due to exception java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: java.lang.String is not a valid external type
    for schema of decimal(0,0)
    if (assertnotnull(input[0, org.apache.spark.sql.Row, true]).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, 
validateexternaltype(getexternalrowfield(assertnotnull(input[0, 
org.apache.spark.sql.Row, true]), 0, grpKey), StringType), true, false) AS grpKey#211
    ..
    if (assertnotnull(input[0, org.apache.spark.sql.Row, true]).isNullAt) 
null else staticinvoke(class org.apache.spark.sql.types.Decimal$, DecimalType(0,0), fromDecimal, 
validateexternaltype(getexternalrowfield(assertnotnull(input[0, 
org.apache.spark.sql.Row, true]), 7, srcRealmId), DecimalType(0,0)), true, false) AS srcRealmId#218
    ..

Существует флаг no , чтобы сообщить Spark прекратить вывод Strings как BigDecimal sучитывая «числовые» данные при записи в Паркет.Так что еще можно сделать здесь?

...