使用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,然后执行计算。
根据Avro->Spark SQL转换支持的类型,bytes
Avro类型被转换为Spark SQL的binarytype
(另请参见代码)。
根据源代码,您可以使用avroschema
选项定义自己的自定义模式,即。
spark.read
.format("com.databricks.spark.avro")
.option("avroSchema", yourSchemaHere)
它提供了指定从BinaryType
到Decimal
的映射的方法。
我有一个场景,我想创建具有时间戳列的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格式?