プロジェクトのgithubアドレス:bitcarmanlee easy-algorithm-interview-and-practice
誰もがスターを付け、メッセージを残し、一緒に学び、進歩することを歓迎します
1.データフレームのデフォルトの列名
spark sqlがテキストを読み取ってデータフレームを生成するとき、テキストに独自のスキーマ情報がない場合、この形式のデフォルトの列名は_c0、_c1です。例を見ることができます。
データは以下の通りです
101 brand1
101 brand2
101 brand3
102 brand1
102 brand3
102 brand3
102 brand4
103 brand2
103 brand2
103 brand2
103 brand5
103 brand5
上記のcsvテキストを読んでからデータフレームを生成すると、スキーマ情報は次のようになります。
@Test
def parse2() = {
val sparkConf = new SparkConf().setMaster("local[2]")
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
val path = "xxx"
val df = spark.read
.option("header", "false")
.option("sep", "\t")
.csv(path)
df.printSchema()
}
最終的な出力は
root
|-- _c0: string (nullable = true)
|-- _c1: string (nullable = true)
テキストのデフォルトの2列は、_c0、_c1です。
2.withColumnRenamedで名前を変更します
実際の開発プロセスでは、通常、各列に名前を付けます。これにより、その後の開発が容易になります。メソッドの1つは、withColumnsメソッドを使用できます。
val df = spark.read
.option("header", "false")
.option("sep", "\t")
.csv(path)
.withColumnRenamed("_c0", "appid")
.withColumnRenamed("_c1", "brand")
df.printSchema()
withColumnsメソッドは、一度に1つの列の名前を変更します。列が多い場合は、明らかに特に便利ではありません。現時点では、後者のメソッドを使用できます。
3.toDFメソッド
val df1 = spark.read
.option("header", "false")
.option("sep", "\t")
.csv(path)
.toDF("appid", "brand")
名前の変更を目的として、ToDFの直後に列名が続きます。
toDFを使用する別の方法があります
val names = Seq("appid", "brand")
val df = spark.read
.option("header", "false")
.option("sep", "\t")
.csv(path)
.toDF(names: _*)
df.printSchema()
その中で_*
、全体として、特定のパラメーターをパラメーターのシーケンスとして扱いたいことをコンパイラーに伝えます。toDFのメソッドシグネチャはdef toDF(colNames: String*)
、パラメータが可変長の文字列シーケンスであり、names: _*
seqをパラメータシーケンスとして扱うことができることです。