resource_serialized
以下のように、値としてJSON文字列を持つ列を持つデータセットを持つ単純なプログラムがあります。
import org.apache.spark.SparkConf
object TestApp {
def main(args: Array[String]): Unit = {
val sparkConf: SparkConf = new SparkConf().setAppName("Loading Data").setMaster("local[*]")
val spark = org.apache.spark.sql.SparkSession
.builder
.config(sparkConf)
.appName("Test")
.getOrCreate()
val json = "[{\"resource_serialized\":\"{\\\"createdOn\\\":\\\"2000-07-20 00:00:00.0\\\",\\\"genderCode\\\":\\\"0\\\"}\",\"id\":\"00529e54-0f3d-4c76-9d3\"}]"
import spark.implicits._
val df = spark.read.json(Seq(json).toDS)
df.printSchema()
df.show()
}
}
印刷されたスキーマは次のとおりです。
root
|-- id: string (nullable = true)
|-- resource_serialized: string (nullable = true)
コンソールに出力されるデータセットは次のとおりです。
+--------------------+--------------------+
| id| resource_serialized|
+--------------------+--------------------+
|00529e54-0f3d-4c7...|{"createdOn":"200...|
+--------------------+--------------------+
resource_serialized
フィールドには、(デバッグコンソールから)でJSON文字列を、持っています
今、私はそのjson文字列からデータセット/データフレームを作成する必要があります、どうすればこれを達成できますか?
私の目標は、次のようなデータセットを取得することです。
+--------------------+--------------------+----------+
| id| createdOn|genderCode|
+--------------------+--------------------+----------+
|00529e54-0f3d-4c7...|2000-07-20 00:00 | 0|
+--------------------+--------------------+----------+
以下のソリューションでは、のすべてのキー値resource_serialized
を(String,String)
テーブルにマップできます。テーブルは後で解析マップできます。
import org.apache.spark.SparkConf
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.{MapType, StringType}
object TestApp {
def main(args: Array[String]): Unit = {
val sparkConf: SparkConf = new SparkConf().setAppName("Loading Data").setMaster("local[*]")
val spark = org.apache.spark.sql.SparkSession
.builder
.config(sparkConf)
.appName("Test")
.getOrCreate()
val json = "[{\"resource_serialized\":\"{\\\"createdOn\\\":\\\"2000-07-20 00:00:00.0\\\",\\\"genderCode\\\":\\\"0\\\"}\",\"id\":\"00529e54-0f3d-4c76-9d3\"}]"
import spark.implicits._
val df = spark.read.json(Seq(json).toDS)
val jsonColumn = from_json($"resource_serialized", MapType(StringType, StringType))
val keysDF = df.select(explode(map_keys(jsonColumn))).distinct()
val keys = keysDF.collect().map(f=>f.get(0))
val keyCols = keys.map(f=> jsonColumn.getItem(f).as(f.toString))
df.select( $"id" +: keyCols:_*).show(false)
}
}
出力は次のようになります
+----------------------+---------------------+----------+
|id |createdOn |genderCode|
+----------------------+---------------------+----------+
|00529e54-0f3d-4c76-9d3|2000-07-20 00:00:00.0|0 |
+----------------------+---------------------+----------+
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加