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

如何将csv直接加载到Spark数据集中?

杨乐
2023-03-14
org.apache.spark.sql.AnalysisException: Cannot up cast `probability` from string to float as it may truncate
The type path of the target object is:
- field (class: "scala.Float", name: "probability")
- root class: "TFPredictionFormat"
You can either add an explicit cast to the input data or choose a higher precision type of the field in the target object;

此外,特别是对于它得到的短语字段(检查case class[2])

org.apache.spark.sql.AnalysisException: cannot resolve '`phrases`' due to data type mismatch: cannot cast StringType to ArrayType(StringType,true);

如果我将case类[2]中的所有字段都定义为String类型,那么一切都很好,但这不是我想要的。有没有一个简单的方法做这件事[3]?

参考文献

B017NX63A2,Merrell,"['merrell_for_men', 'merrell_mens_shoes', 'merrel']",merrell_shoes,0.0806054356579781
import spark.implicits._

val INPUT_TF = "<SOME_URI>/my_file.csv"

final case class TFFormat (
    doc_id: String,
    brand: String,
    phrases: Seq[String],
    prediction: String,
    probability: Float
)

val ds = sqlContext.read
.option("header", "true")
.option("charset", "UTF8")
.csv(INPUT_TF)
.as[TFFormat]

ds.take(1).map(println)

[3]我已经找到了这样做的方法,首先在DataFrame级别上定义列,然后将事情转换为Dataset(比如here或here或here),但我几乎可以肯定,这不是应该做的事情。我也很确定编码器可能是答案,但我不知道如何

共有1个答案

陈嘉荣
2023-03-14

TL;使用CSV的DR和标准DataFrame操作进行输入转换是可行的。如果您想避免,您应该使用具有表达性的输入格式(Parquet甚至JSON)。

通常,要转换为静态类型数据集的数据必须已经具有正确的类型。最有效的方法是为CSV阅读器提供模式参数:

val schema: StructType = ???
val ds = spark.read
  .option("header", "true")
  .schema(schema)
  .csv(path)
  .as[T]

其中架构可以通过反射来推断:

import org.apache.spark.sql.catalyst.ScalaReflection
 import org.apache.spark.sql.types.StructType

val schema = ScalaReflection.schemaFor[T].dataType.asInstanceOf[StructType]
import org.apache.spark.sql.functions._

val df: DataFrame = ???  // Raw data

df
  .withColumn("probability", $"probability".cast("float"))
  .withColumn("phrases",
    split(regexp_replace($"phrases", "[\\['\\]]", ""), ","))
  .as[TFFormat]
 类似资料:
  • csv文件中的每一行结构如下:

  • 问题内容: 不知道我在这里缺少什么,但是这段代码运行时没有任何错误消息,但是表中没有任何内容。我正在将三列的CSV值加载到mysql表中 如果有人可以看看,将不胜感激。 谢谢。 问题答案: 我认为您必须将所有内容插入。 像这样

  • 我需要将来自textarea输入的XML数据发布到PHP,以便解析它并输出一个表。 我尝试了一些方法,但似乎都不奏效。 目前我有: PHP是: 第一个回声$xmlraw正在工作——它在一行中输出XML字符串——帖子正在正确地发送数据。 第二个echo$xml不输出任何东西,Foreach也不输出任何东西——在PHP中有些东西不起作用 我还尝试将$xmlraw直接加载到simplexml_load_

  • 其次,是否需要从Graphene DB实例访问csv导入文件,或者这是客户端关心的问题?

  • NEO4J2.1.7 试图通过我在CSV中收到的信息大量连接一堆节点,如下所示: PS:我尝试了上面的语法,也尝试了,都没有用(语法错误)

  • 新年快乐!!! 我知道以前也有人问过/回答过类似的问题,但我的问题不同: 我有100个字段和100MB的大尺寸csv,我想将其加载到Spark(1.6)进行分析,csv的标头看起来像附加的样本(只有一行数据) 非常感谢你。 更新1(美国东部时间2016年12月31日下午1:26): 我使用以下方法并能够加载数据(具有有限列的示例数据),但是,我需要自动将标头(来自csv)分配为DataFrame中