使用Scala API将TSV读入Spark Dataframe

31

我一直在尝试使用Databricks库来读取CSV文件。 我正在尝试使用Scala API将由Hive创建的TSV文件读取到Spark数据框中。

这里有一个示例,可以在Spark shell中运行(我将示例数据公开,以便您可以使用它)

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

val sqlContext = new SQLContext(sc)
val segments = sqlContext.read.format("com.databricks.spark.csv").load("s3n://michaeldiscenza/data/test_segments")

文档中提到您可以指定分隔符,但我不清楚如何指定该选项。

3个回答

40
所有的选项参数都应该像下面这样传递到option()函数中:
val segments = sqlContext.read.format("com.databricks.spark.csv")
    .option("delimiter", "\t")
    .load("s3n://michaeldiscenza/data/test_segments")

16
对于具有SparkSession的本机DataFrameReader,选项称为“sep”: spark.read.option("sep", "\t").csv("PATH") - Steffen Schmitz
我得到了一个长长的错误信息 "Traceback (most recent call last): File "/tmp/zeppelin_pyspark-1508289913406712111.py", line 367, in <module> Exception: Traceback (most recent call last): File "/tmp/zeppelin_pyspark-1508289913406712111.py", line 360, in <module>.... File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value format(target_id, ".", name), value) Py4JJavaError: 在调用 o929.load 时发生错误。" - Amir
1
@Michael Discenza我认为答案需要针对最新版本的Spark进行更新,或者问题应该包括Spark的版本。 - Chadwick Robbert

36
使用 Spark 2.0+ 内置的 CSV 连接器,可以避免依赖于第三方,获得更好的性能表现:
val spark = SparkSession.builder.getOrCreate()
val segments = spark.read.option("sep", "\t").csv("/path/to/file")

2
这是适用于新版Spark的正确答案。但考虑到Databricks对Spark开源社区做出了极大贡献,而且com.databricks.spark.csv本质上就是内置csv连接器,所以我不会把Databricks称为第三方。但总体而言你说得很有道理。 - Davos

0
您也可以尝试推断架构并检查架构。
val df = spark.read.format("csv")
      .option("inferSchema", "true")
      .option("sep","\t")
      .option("header", "true")
      .load(tmp_loc)

   df.printSchema()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接