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

必需:org。阿帕奇。火花sql。一行

苏涛
2023-03-14

我在尝试将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.行MsgRow(row.getLong(0),row.getString(1),row.getString(2),hex2int(row.getString(3)))^

我不明白——为什么火花/scala期待一个行对象?我见过的例子中没有一个涉及到向行的显式转换,事实上大多数都涉及到一个匿名函数返回一个case类对象,就像我上面提到的那样。出于某种原因,谷歌搜索“必需:org.apache.spark.sql.行”只返回五个结果,没有一个与我的情况有关。这就是为什么我把标题做得如此不具体,因为误报的可能性很小。提前谢谢!

共有2个答案

岳宣
2023-03-14

感谢@Ramesh指出我代码中的错误。他的解决方案是可行的,但它也没有提到与我的OP更直接相关的问题,即从map返回的结果不是一个数据帧,而是一个数据集。我所需要做的不是创建一个新变量,而是进行更改

txs = txs.map(row=> 
    MsgRow(row.getLong(0), row.getString(1), row.getString(2), hex2int(row.getString(3)))
)

txs = txs.map(row=> 
    MsgRow(row.getLong(0), row.getString(1), row.getString(2), hex2int(row.getString(3)))
).toDF

这可能是包含我的标题的大多数错误的简单答案。虽然@Ramesh的答案消除了这个错误,但我后来遇到了另一个错误,当我试图将这个结果连接到另一个数据帧时,这个错误与同一个基本问题有关。

宦翔飞
2023-03-14

您的错误是因为您正在将输出存储到同一个变量中,txs在返回MsgRow时需要Row。所以改变

txs = txs.map(row=> 
        MsgRow(row.getLong(0), row.getString(1), row.getString(2), hex2int(row.getString(3)))
)

val newTxs = txs.map(row=>
  MsgRow(row.getLong(0), row.getString(1), row.getString(2), (new BigInteger(row.getString(3).substring(2),16)).doubleValue)
)

应该能解决你的问题。

我已经排除了hex2int函数作为它的序列化错误。

 类似资料:
  • 目前我正在研究Apache spark和Apache ignite框架。 这篇文章介绍了它们之间的一些原则差异,但我意识到我仍然不理解它们的目的。 我的意思是,哪一个问题更容易产生火花而不是点燃,反之亦然?

  • 阅读 https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/feature/Word2Vec.scala 这种实现的文字是谷歌Word2Vec的一个端口 https://code.google.com/archive/p/word2vec/ 这是“向量空间中单词表示的有效估计”

  • 我处理了像这样存储的双精度列表: 我想计算这个列表的平均值。根据文档,: MLlib的所有方法都使用Java友好类型,因此您可以像在Scala中一样导入和调用它们。唯一的警告是,这些方法采用Scala RDD对象,而Spark Java API使用单独的JavaRDD类。您可以通过对JavaRDD对象调用.RDD()将JavaRDD转换为Scala RDD。 在同一页面上,我看到以下代码: 根据我

  • 我将spark java代码实现为,数据集输入=spark。读取()。拼花地板(configuration.getInputDataLocation()); 但是inputDataLocation(Azure存储帐户容器中的文件夹)可能没有任何数据,并且在这种情况下引发异常,用户类引发异常:org。阿帕奇。火花sql。AnalysisException:无法推断拼花地板的架构。必须手动指定。 有没

  • 在我部署在WebSphere 8.5上的java应用程序中,我遇到了这个错误,尽管我的maven依赖项低于log4j。 我确实运行了一个,我可以看到它正以 的形式被拉进来,这是我期望在树结果中看到的,这样我就可以确认它在类路径中。有什么想法吗?