csv 如何让Spark SQL导入一个没有“L”后缀的Long?

afdcj2ne  于 2023-11-14  发布在  Spark
关注(0)|答案(1)|浏览(146)

我有一组CSV的,我通过Sqoop'ing一个mySQL数据库产生的。我试图将它们定义为Spark中的一个框架的源代码。
源数据库中的模式包含几个Long数据类型的字段,实际上在这些字段中存储了大量的数字。
当试图访问该数组时,Scala在解释这些时会阻塞,因为我在长整数上没有L后缀。
例如,这会抛出一个错误:val test: Long = 20130102180600
如果成功:val test: Long = 20130102180600L
有没有什么方法可以强制Scala将这些字段解释为不带后缀的长整数?由于数据的规模,我认为在字段从数据库中出来时对其进行后处理是不可行的。

q5lcpyga

q5lcpyga1#

给予模式,如自述文件中的示例所示:

import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

val sqlContext = new SQLContext(sc)
val customSchema = StructType(Array(
    StructField("year", IntegerType, true),
    StructField("make", StringType, true),
    StructField("model", StringType, true),
    StructField("comment", StringType, true),
    StructField("blank", StringType, true)))

val df = sqlContext.load(
    "com.databricks.spark.csv",
    schema = customSchema,
    Map("path" -> "cars.csv", "header" -> "true"))

val selectedData = df.select("year", "model")
selectedData.save("newcars.csv", "com.databricks.spark.csv")

字符串
当然,除了对大整数字段使用LongType之外。
查看代码,这看起来确实应该工作:使用TypeCast.castTo将字段从String转换为所需的类型,而LongTypeTypeCast.castTo只需调用datum.toLong,即可按需工作(你可以在Scala REPL中检查"20130102180600".toLong)。事实上,InferSchema也可以处理这种情况。我强烈怀疑这个问题是不同的:也许这些数字甚至超出了Long的范围?

相关问题