Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala:无法从字符串向上转换为int,因为它可能会截断_Scala_Apache Spark - Fatal编程技术网

Spark Scala:无法从字符串向上转换为int,因为它可能会截断

Spark Scala:无法从字符串向上转换为int,因为它可能会截断,scala,apache-spark,Scala,Apache Spark,我在玩spark时遇到了这个异常 线程“main”org.apache.spark.sql.AnalysisException中的异常: 无法将price从字符串向上转换为int,因为它可能会截断 目标对象的类型路径为: -字段(类:“scala.Int”,名称:“price”) -根类:“org.spark.code.executable.Main.Record” 可以向输入数据添加显式强制转换,也可以在目标对象中选择精度更高的字段类型 如何解决这个例外?这是密码 object Main {

我在玩spark时遇到了这个异常

线程“main”org.apache.spark.sql.AnalysisException中的异常: 无法将
price
从字符串向上转换为int,因为它可能会截断 目标对象的类型路径为: -字段(类:“scala.Int”,名称:“price”) -根类:“org.spark.code.executable.Main.Record” 可以向输入数据添加显式强制转换,也可以在目标对象中选择精度更高的字段类型

如何解决这个例外?这是密码

object Main {

 case class Record(transactionDate: Timestamp, product: String, price: Int, paymentType: String, name: String, city: String, state: String, country: String,
                accountCreated: Timestamp, lastLogin: Timestamp, latitude: String, longitude: String)
 def main(args: Array[String]) {

   System.setProperty("hadoop.home.dir", "C:\\winutils\\");

   val schema = Encoders.product[Record].schema

   val df = SparkConfig.sparkSession.read
  .option("header", "true")
  .csv("SalesJan2009.csv");

   import SparkConfig.sparkSession.implicits._
   val ds = df.as[Record]

  //ds.groupByKey(body => body.state).count().show()

  import org.apache.spark.sql.expressions.scalalang.typed.{
  count => typedCount,
  sum => typedSum
}

  ds.groupByKey(body => body.state)
  .agg(typedSum[Record](_.price).name("sum(price)"))
  .withColumnRenamed("value", "group")
  .alias("Summary by state")
  .show()
}

首先读取csv文件,并尝试将其转换为具有不同架构的dataset。最好在读取csv文件时传递创建的模式,如下所示

val spark = SparkSession.builder()
  .master("local")
  .appName("test")
  .getOrCreate()

import org.apache.spark.sql.Encoders
val schema = Encoders.product[Record].schema

val ds = spark.read
  .option("header", "true")
  .schema(schema)  // passing schema 
  .option("timestampFormat", "MM/dd/yyyy HH:mm") // passing timestamp format
  .csv(path)// csv path
  .as[Record] // convert to DS
默认时间戳格式为
yyyy-MM-dd'HH:MM:ss.SSSXXX
,因此您还需要传递自定义时间戳格式


希望这能有所帮助

就我而言,问题在于我使用的是:

case class OriginalData(ORDER_ID: Int, USER_ID: Int, ORDER_NUMBER: Int, ORDER_DOW: Int, ORDER_HOUR_OF_DAY: Int, DAYS_SINCE_PRIOR_ORDER: Double, ORDER_DETAIL: String)
但是,在CSV文件中,我有以下示例:

是的,如果“星期五”只显示代表一周中几天的整数,这意味着我需要清理数据。但是,为了能够使用
spark.read.CSV(“data/jaimomentoya/01.CSV”)
读取我的CSV文件,我使用了以下代码,其中
ORDER\u DOW
的值现在是
String
,不再是
Int

case class OriginalData(ORDER_ID: Int, USER_ID: Int, ORDER_NUMBER: Int, ORDER_DOW: String, ORDER_HOUR_OF_DAY: Int, DAYS_SINCE_PRIOR_ORDER: Double, ORDER_DETAIL: String)

你能尝试将案例类记录移到main之外吗?你能发布样本数据吗?@Shankar Koirala这里是我正在使用的数据链接是的,我也尝试将案例类记录移到main之外main@ShankarKoirala抱歉,现在我检查将DataFrame转换为DataSet[Record]时是否出现此问题。请帮忙,有没有任何理由这在spark shell中不起作用?当我按照您的建议添加模式时,我的代码会编译(
:paste
)并运行(
main.main
),但所有行中的所有字段都会返回
null
@combinator,这应该也适用于spark shell。@Shankar,那么如果它与模式一起运行,但每个字段都是null,那么(通常)这意味着什么呢?这是否意味着文件中没有一行与我的模式匹配,或者可能是其他内容?它是否适用于普通类?其中一个原因可能是,与某些字段的模式不匹配,加载该行所有列的模式将为空。很好!不知道如何使用
编码器进行提取。产品[MyCaseClass]。架构