【发布时间】:2018-04-21 23:04:40
【问题描述】:
我在尝试将 spark 数据帧的一列从十六进制字符串转换为双精度时遇到问题。我有以下代码:
import spark.implicits._
case class MsgRow(block_number: Long, to: String, from: String, value: Double )
def hex2int (hex: String): Double = (new BigInteger(hex.substring(2),16)).doubleValue
txs = txs.map(row=>
MsgRow(row.getLong(0), row.getString(1), row.getString(2), hex2int(row.getString(3)))
)
我无法分享我的 txs 数据框的内容,但这里是元数据:
>txs
org.apache.spark.sql.DataFrame = [blockNumber: bigint, to: string ... 4 more fields]
但是当我运行它时,我得到了错误:
错误:类型不匹配; 找到:MsgRow 必需:org.apache.spark.sql.Row MsgRow(row.getLong(0), row.getString(1), row.getString(2), hex2int(row.getString(3))) ^
我不明白——为什么 spark/scala 需要一个行对象?我所见过的例子都没有涉及到行的显式转换,事实上,它们中的大多数都涉及返回案例类对象的匿名函数,就像我上面所说的那样。出于某种原因,谷歌搜索“必需:org.apache.spark.sql.Row”只返回五个结果,其中没有一个与我的情况有关。这就是为什么我把标题写得如此不具体,因为误报的可能性很小。提前致谢!
【问题讨论】:
标签: scala apache-spark