Java 如何从现有的Dataframe创建Dataframe,并将特定字段设置为Struct type?
我需要从现有的DataFrame创建一个DataFrame,在其中我还需要更改模式 我有一个数据帧,如:Java 如何从现有的Dataframe创建Dataframe,并将特定字段设置为Struct type?,java,scala,apache-spark,dataframe,dataset,Java,Scala,Apache Spark,Dataframe,Dataset,我需要从现有的DataFrame创建一个DataFrame,在其中我还需要更改模式 我有一个数据帧,如: +-----------+----------+-------------+ |Id |Position |playerName | +-----------+-----------+------------+ |10125 |Forward |Messi | |10126 |Forward |Ronaldo | |1
+-----------+----------+-------------+
|Id |Position |playerName |
+-----------+-----------+------------+
|10125 |Forward |Messi |
|10126 |Forward |Ronaldo |
|10127 |Midfield |Xavi |
|10128 |Midfield |Neymar |
我是使用下面给出的case类创建的:
case class caseClass (
Id: Int = "",
Position : String = "" ,
playerName : String = ""
)
现在我需要在Struct type下创建Playername和position
即
我需要用schema创建另一个数据帧
根
|--Id:int(nullable=true)
|--playerDetails:struct(nullable=true)
||--playername:string(nullable=true)
||--位置:字符串(nullable=true)
我通过引用链接创建了一个新的数据帧,代码如下
myschema是
List(
StructField("Id", IntegerType, true),
StructField("Position",StringType, true),
StructField("playerName", StringType,true)
)
我尝试了以下代码
spark.sparkContext.parallelize(data),
myschema
)
但我不能让它发生
我看到了类似的问题
但我不明白解决办法
在case类中是否有直接实现StructType的解决方案?因此,我认为我不需要创建自己的架构来创建结构类型值。可以使用函数“struct”:
// data
val playersDF = Seq(
(10125, "Forward", "Messi"),
(10126, "Forward", "Ronaldo"),
(10127, "Midfield", "Xavi"),
(10128, "Midfield", "Neymar")
).toDF("Id", "Position", "playerName")
// action
val playersStructuredDF = playersDF.select($"Id", struct("playerName", "Position").as("playerDetails"))
// display
playersStructuredDF.printSchema()
playersStructuredDF.show(false)
输出:
root
|-- Id: integer (nullable = false)
|-- playerDetails: struct (nullable = false)
| |-- playerName: string (nullable = true)
| |-- Position: string (nullable = true)
+-----+------------------+
|Id |playerDetails |
+-----+------------------+
|10125|[Messi, Forward] |
|10126|[Ronaldo, Forward]|
|10127|[Xavi, Midfield] |
|10128|[Neymar, Midfield]|
+-----+------------------+
您的解决方案很好,但在我的例子中,val inputFile=spark.read.textFile(“C:\\Users\\adarsh.k\\Downloads\\players.txt”)inputFile.map(lines=>{val Id=extractFun(lines,““regex”))val position=extractFun(lines,““regex”“”))val playerName=extractFun(lines,““regex”“”)val playerName=extractFun(lines,““regex”“”)casecasclass.toDF()我将vlaues带到这样的case类中。我有一个使用regex提取数据的函数。使用此解决方案时,我在线程“main”org.apache.spark.sql.AnalysisException中遇到了一个错误:无法解析给定输入列:[value];的“
Id
”;;从原始数据提取到案例类似乎有问题,猜猜,这超出了原始问题的范围。对不起,这实际上是我的错误。我没有将inputFile.map作为数据帧。当我尝试val newData=inputFile.map(lines=>{……..}时,它对我很有效……非常感谢。现在我变得像[Messi,Forward]了,我能像[Messi:Forward]那样得到键值对吗??