web-dev-qa-db-ja.com

SparkでCSVファイルからヘッダーをスキップするにはどうすればよいですか?

Sparkコンテキストへの3つのファイルパスを読み取り、各ファイルの最初の行にスキーマがあるとします。ヘッダーからスキーマ行をスキップするにはどうすればよいですか?

val rdd=sc.textFile("file1,file2,file3")

さて、このrddからヘッダー行をスキップするにはどうすればよいですか?

65
Hafiz Mujadid

最初のレコードにヘッダー行が1つしかない場合、最も効率的なフィルタリング方法は次のとおりです。

rdd.mapPartitionsWithIndex {
  (idx, iter) => if (idx == 0) iter.drop(1) else iter 
}

もちろん、内部に多くのヘッダー行を持つ多くのファイルがある場合、これは役に立ちません。実際、この方法で作成した3つのRDDを結合できます。

また、ヘッダーになる可能性のある行のみに一致するfilterを記述することもできます。これは非常に簡単ですが、効率は劣ります。

同等のPython:

from itertools import islice

rdd.mapPartitionsWithIndex(
    lambda idx, it: islice(it, 1, None) if idx == 0 else it 
)
62
Sean Owen
data = sc.textFile('path_to_data')
header = data.first() #extract header
data = data.filter(row => row != header)   #filter out header
88
Jimmy

Spark 2.0では、CSVリーダーがSparkに組み込まれているため、次のようにCSVファイルを簡単にロードできます。

spark.read.option("header","true").csv("filePath")
54
Sandeep Purohit

Spark 2.以降では、SparkSessionを使用して、これを1つのライナーとして実行できます。

val spark = SparkSession.builder.config(conf).getOrCreate()

そして、@ SandeepPurohitが言ったように:

val dataFrame = spark.read.format("CSV").option("header","true").load(csvfilePath)

私はそれがあなたの質問を解決したことを願っています!

追記:SparkSessionはSpark 2.で導入された新しいエントリポイントであり、spark_sqlパッケージの下にあります

12
Shiv4nsh

PySparkでは、データフレームを使用してヘッダーをTrueに設定できます。

df = spark.read.csv(dataPath, header=True)
7
hayj

各ファイルを個別にロードし、file.zipWithIndex().filter(_._2 > 0)でフィルタリングしてから、すべてのファイルRDDを結合できます。

ファイルの数が多すぎる場合、ユニオンはStackOverflowExeptionをスローできます。

5
pzecevic

最初の列名をフィルタリングしてヘッダーを削除することにより、PySparkでfilter()メソッドを使用します。

# Read file (change format for other file formats)
contentRDD = sc.textfile(<filepath>)

# Filter out first column of the header
filterDD = contentRDD.filter(lambda l: not l.startswith(<first column name>)

# Check your result
for i in filterDD.take(5) : print (i)
3
kumara81205

2018年の作業(Spark 2.3)

Python

df = spark.read
    .option("header", "true")
    .format("csv")
    .schema(myManualSchema)
    .load("mycsv.csv")

スカラ

val myDf = spark.read
  .option("header", "true")
  .format("csv")
  .schema(myManualSchema)
  .load("mycsv.csv")

PD1:myManualSchemaは私が作成した定義済みのスキーマです。コードのその部分はスキップできます

2
Antonio Cachuan

これは、read()コマンドに渡すオプションです。

context = new org.Apache.spark.sql.SQLContext(sc)

var data = context.read.option("header","true").csv("<path>")
1

または、spark-csvパッケージを使用することもできます(またはSpark 2.0では、これは多かれ少なかれネイティブとしてCSVとして利用可能です)。これは各ファイルのヘッダーを期待することに注意してください(必要に応じて):

schema = StructType([
        StructField('lat',DoubleType(),True),
        StructField('lng',DoubleType(),True)])

df = sqlContext.read.format('com.databricks.spark.csv'). \
     options(header='true',
             delimiter="\t",
             treatEmptyValuesAsNulls=True,
             mode="DROPMALFORMED").load(input_file,schema=schema)
0
Adrian Bridgett