Я имею дело с данными, в которых есть некоторые поля с данными, подобными этим:
123456789.00000
.. но для которых нам нужно рассматривать их как строки в выходном файле партера.
Проблема заключается в том, что программа чтения и записи Spark для паркетной машины выводит эти столбцы как BigDecimal
.После значительного расследования я узнал, как справиться с чтением этих: к сожалению, необходимо сделать cast
после факта ..
Но написание ?Я не нашел какого-либо способа справиться с этим.Внутренняя схема и поля уже установлены на String
:
Здесь мы видим внутреннюю схему:
Но - просто чтобы быть уверенным - столбец srcRealmId
явно приведен к String
:
val outDf = matchedDf.withColumn("srcRealmId",$"srcRealmId".cast(StringType))
Теперь давайте рассмотрим выводсхема outDf
:
Все поля являются строками.
Но это все еще терпит неудачу:
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учитывая «числовые» данные при записи в Паркет.Так что еще можно сделать здесь?