当前位置: 首页 > 知识库问答 >
问题:

如何将Avro中的bytes列(用logicaltype作为decimal)转换为decimal?

马星阑
2023-03-14

使用databricks spark-avro在spark中创建数据帧后,当我试图使用sum函数求和TOT_AMT列时,它会抛出“function sum requires numeric types not binarytype”错误。

该列在avro模式中定义如下,

name=“tot_amt”,“type”:[“null”,{“type”:“bytes”,“logicaltype”:“decimal”,“precision”:20,“scale”:10}]

我正在创建dataframe并总结,

val df=sqlContext.read.format("com.databricks.spark.avro").load("input dir")
df.agg(sum("TOT_AMT")).show()

在创建DataFrame时,decimal值似乎被读取为Binarytype。在这种情况下,我们如何对这样的十进制列执行数值运算呢?是否可以将此字节数组转换为BigDecimal,然后执行计算。

共有1个答案

孔嘉茂
2023-03-14

根据Avro->Spark SQL转换支持的类型,bytesAvro类型被转换为Spark SQL的binarytype(另请参见代码)。

根据源代码,您可以使用avroschema选项定义自己的自定义模式,即。

spark.read
  .format("com.databricks.spark.avro")
  .option("avroSchema", yourSchemaHere)

它提供了指定从BinaryTypeDecimal的映射的方法。

 类似资料:
  • 我有一个场景,我想创建具有时间戳列的avro文件,它看起来像2016-11-16 06:43:19.77

  • 问题内容: 我正在尝试将int []转换为bytes。它也被转换。 我的转换代码是这样的。 假设我输入一个int [] = {10,11,15,41,12,8,4,23,5,17,23,36,6}现在我希望字节数组像这样{10,0 ,0,0,11,0,0,0,15,0,0,0,41,0,0,0,12,0,0,0,8,0,0,0,4,0,0 ,0,23,0,0,0,5,0,0,0,17,0,0,0,

  • 问题内容: 我已经将包含字符串值(例如吃)和浮动值(例如0.87)的CSV文件导入到phpMyAdmin数据库的表中。获得所有字符串值并仅保留具有十进制值的行后,需要将此类值从VARCHAR转换为DECIMAL / FLOAT,以便可以对该属性执行MAX()。 我该怎么做呢?每次我尝试通过phpMyAdmin中的GUI进行此操作时,我所有的值都会自动四舍五入为0和1s。 请帮我! 问题答案: 我认

  • 我遇到了奇怪的问题时,铸造小数到双倍。 以下代码返回true: 但是,当我将其强制转换为双倍时,它返回false: 这是记录在案的行为吗?当我被迫将decimal转换为Double时,我如何避免它? Visual Studio的截图: 将Math.round铸造为双倍me,结果如下: null 不幸的是,我不能在较小的项目中重现这个问题。我想埃里克的回答解释了原因。

  • 问题内容: 我正在尝试将文件保存到SQL Server数据库中,该文件将保存在其中的列是datatype 。 我目前这样做的方式是通过获取文件路径并将文件转换为字节数组。 然后,我使用插入查询和convert函数将字节插入数据库,以将转换为: 但是,在SQL Server数据库中,的值始终为 而且,无论选择哪个文件,都始终是该数字。因此,如果您能告诉我为什么会这样,以及我应该采取什么措施来防止这种

  • 如何使用用户指定的架构将dataframe转换为Avro格式?