データセットを作成します。
オブジェクトDatasetCreation { DEFメイン(引数:配列[文字列]):単位= { ヴァルスパーク= SparkSession .builder() .appName( "SparkSessionTest") .getOrCreate() インポートspark.implicits._ // 1:範囲 ヴァルのDS1 = spark.range(0、10、2、2) ds1.show() ヴァル犬=配列(ドッグ( "jitty"、 "赤")、犬( "mytty"、 "黄")) ヴァル・猫=配列(新猫( "jitty"、2)、新しい猫( "mytty"、4)) // 2:从配列[T]中创建 ヴァルデータ=犬 ヴァルDS = spark.createDataset(データ) ds.show() // 3:从RDD [T]中创建 ヴァルdogRDD = spark.sparkContext.parallelize(イヌ)並列化(犬) のval dogDS = spark.createDataset(dogRDD) dogDS。ショー() ヴァルcatRDD = spark.sparkContext.parallelize(ネコ) //のVal catDSWithoutEncoder = spark.createDataset(catRDD) ヴァルcatDS = spark.createDataset(catRDD)(Encoders.bean(classOf [猫])) catDS.show() //エンコーダ负责JVM对象类型スパークSQL与内部数据类型之间的转换 ヴァルintDs = SEQ(1、2、3).toDS()は暗黙的に提供される//(spark.implicits.newIntEncoder) ヴァル・seqIntDs =配列(SEQ(1)、配列(2)配列(3))。TODS()は暗黙的に提供される//(spark.implicits.newIntSeqEncoder) ヴァル・arrayIntDs =配列(配列(1)、アレイ(2)、アレイ(3))。TODSを()/ /暗黙的に提供(spark.implicits.newIntArrayEncoder) //支持的エンコーダ有如下: Encoders.product //タプルとケースクラス Encoders.scalaBoolean Encoders.scalaByte Encoders.scalaDouble Encoders.scalaFloat Encoders.scalaInt Encoders.scalaLong Encoders.scalaShort Encoders.bean(classOf [猫]) spark.stop() } }
データフレームを作成します
インポートorg.apache.spark.sql.types {IntegerType、StringType、StructField、StructType}。 インポートorg.apache.spark.sql {行、SparkSession} オブジェクトDataFrameCreation { DEFメイン(引数:配列[文字列]):単位= { ヴァルスパーク= SparkSessionの .builder() .appName( "SparkSessionTest") .getOrCreate() // 1:从RDD [A <:商品]中创建、ケースクラス和タプル都是プロダクト的子类 ヴァルRDD =火花。 sparkContext.textFile( "")。マップ(ライン=> { ヴァルsplitData = line.split( "") 犬(splitData(0)、splitData(1)) }) ヴァルtupleRDD = spark.sparkContext.parallelize(配列( ( "jitty"、2)、( "mytty"、4))) spark.createDataFrame(RDD) spark.createDataFrame(tupleRDD) ヴァルdogRDD = spark.sparkContext.parallelize(配列(犬( "jitty"、 "赤")、犬( "mytty"、 "黄"))) ヴァルdogDf = spark.createDataFrame(dogRDD) dogDf .SHOW() // 2:从配列[<:商品]中创建 ヴァルdogSeq = SEQ(犬( "jitty"、 "赤")、犬( "mytty"、 "黄")) spark.createDataFrame(dogSeq ).SHOW() // 3:用RDD [_] +クラス创建、这个クラス是のJava的ビーン ヴァルcatRDD = spark.sparkContext.parallelize(配列(新しい猫( "jitty"、2)、新しい猫(「mytty 」、4))) //のVal catDf = spark.createDataFrame(catRDD) ヴァルcatDf = spark.createDataFrame(catRDD、classOf [猫]) catDf.show() catDf。createOrReplaceTempView( "猫") spark.sql( "catから選択*")。ショー()//属性の順序は猫が固定されていないチェックアウトすることに注意してください 4 //:RDD [行] +スキーマ作成を使用して ヴァルrowSeq = SEQ( "トム、30"、 "ケイティ、46")。マップ(_。スプリット( ""))。マップ(P =>行(P(0)、P(1).trim.toInt )) valをrowRDD = spark.sparkContext.parallelize(rowSeq) ヴァル・スキーマ= StructType( StructField( "名前"、StringType)、偽:: StructField( "年齢"、IntegerType、真)::無記号) ヴァルDATAFRAME = spark.createDataFrame (rowRDD、スキーマ) dataFrame.printSchema dataFrame.show() // 5:从外部数据源中创建 ヴァルDF = spark.read.json(S "$ {BASE_PATH} /IoT_device_info.json") df.show() 火花.stop() } }
RDD&データセット&DATAFRAME変換
パッケージcom.twq.dataset.creation インポートcom.twq.dataset.Dog インポートorg.apache.spark.rdd.RDDの インポートorg.apache.spark.sql {行、SparkSession} オブジェクトRDDDatasetTransform { DEFメイン(引数:配列[文字列]):単位= { ヴァルスパーク= SparkSession .builder() .appName( "RDDDatasetTransform") .getOrCreate() ヴァル犬= SEQ(犬( "jitty"、 "赤")、犬( "mytty"、「黄")) valをdogRDD = spark.sparkContext.parallelize(犬) // 1:RDD转データフレームの インポートspark.implicits._ ヴァルdogDF = dogRDD.toDF() dogDF.show() ヴァルrenameSchemaDF = dogRDD.toDF(" FIRST_NAME」 、 "lovest_color") renameSchemaDF.show() // 2:DATAFRAME转道路、スキーマ信息丢掉了 ヴァルdogRowRDD:EET [行] = dogDF.rdd dogRowRDD.collect() renameSchemaDF.rdd.collect() // 3:EET转データセット ヴァルdogDS = dogRDD.toDS() dogDS.show() // 4:データセット转EET ヴァルdogRDDFromDs:EET [犬] = dogDS.rdd dogRDDFromDs.collect() // 5:DATAFRAME转データセット ヴァルdogDsFromDf = dogDF.as [犬] dogDsFromDf.show() / / 6:データセット转DATAFRAME ヴァルdogDfFromDs = dogDsFromDf.toDF() dogDfFromDs.show() spark.stop() } }
複雑なデータ型と使用のスキーマ定義
インポートorg.apache.spark.sql.types._ 。インポートorg.apache.spark.sql {行、SaveMode、SparkSession} オブジェクトSchemaApiTest { DEFメイン(引数:配列[文字列]):単位= { ヴァルスパーク= SparkSession 。ビルダー() .appName( "SchemaApiTest") 管理組織のビー玉( "ローカル") .getOrCreate() ヴァルiotDeviceDf = spark.read.json(S "$ {BASE_PATH} /IoT_device_info.json") iotDeviceDf.toString() // 1 :スキーマ的展示 iotDeviceDf.schema iotDeviceDf.printSchema() // 2:スキーマ中可以有复杂数据类型 ヴァルスキーマ= StructType( StructField( "名前"、StringType、偽):: StructField( "年齢"、IntegerType、真):: StructField(、 "マップ"のMapType(StringType、StringType)、真):: StructField( "アレイ"、のArrayType(StringType)、真):: StructField( "構造体"、 StructType(配列(StructField( "フィールド1"、StringType)、StructField( "フィールド2"、StringType)))) ::無記号) valの人= spark.sparkContext.parallelize(配列( "トム、30"、 "ケイティ、46" 。))マップ(。。_スプリット( ""))マップ(P => 行(P(0)、P(1).trim.toInt、マップ(P(0) - > P(1))、 SEQ(P(0)、P(1))、ロウ( "VALUE1"、 "値2"))) valをDATAFRAME = spark.createDataFrame(人、スキーマ) データフレーム。printSchema dataFrame.show() dataFrame.select( "マップ")。コレクト()地図(行=> row.getAs [マップ[文字列、文字列]() "マップ") dataFrame.select( "アレイ")。コレクト()マップ( = ROW> row.getAs [配列[文字列]( "アレイ")) dataFrame.select( "構造体")。コレクト()地図(行=> row.getAs [行]( "構造体")) //スキーマの有用性 ヴァルexampleSchema新しい新StructType =()。追加( "名前"、StringType).add( "年齢"、IntegerType) exampleSchema( "名前")///名情報を抽出し、型 exampleSchema.fields //すべてのフィールドタイプ情報 exampleSchema.fieldNames //すべてのフィールド名 exampleSchema.fieldIndex( "名前")///位置インデックスフィールド 1 @:寄木細工のファイルスキーマのビュー ヴァルsessionDf spark.read.parquet =(S「$ {} BASE_PATH / trackerSession ") sessionDf.schema sessionDf.printSchema() // 2:对两个寄木文件的スキーマ是否相同比 ヴァルchangedSchemaFieldNames = sessionDf.schema.fieldNames.map(フィールド名=> { IF(フィールド名== "pageview_count"){ "pv_count" }他のフィールド名 }) sessionDf.toDF (changedSchemaFieldNames:_ *)。write.mode(SaveMode.Overwrite).parquet(S "$ {BASE_PATH} / trackerSession_changeSchema") ヴァルschemaChangeSessionDf = spark.read.parquet(S "$ {BASE_PATH} / trackerSession_changeSchema") schemaChangeSessionDf.schema schemaChangeSessionDf.printSchema() ヴァルoldSchema = sessionDf.schema ヴァルchangeSchema = schemaChangeSessionDf。スキーマ oldSchema == falseをchangeSchema // // 3:2つのファイルが同じでないスキーマの寄木細工、団結の必要性 ヴァルallSessionError = spark.read.parquet(S "$ {BASE_PATH} / trackerSession"、 "$ {BASE_PATH} / trackerSession_changeSchema" S) allSessionError.printSchema() allSessionError.show() ヴァルallSessionRight = sessionDf.toDF(changeSchema.fieldNamesました: _ *)。連合(schemaChangeSessionDf) allSessionRight.printSchema() allSessionRight.show() spark.stop() } }