尝试使用 python 在 Databricks 上将字符串列拆分为 4 列:A、B、C、D。
# Load CSV file
df = spark.read.format("csv").options(header='false').load("file path")
# Rename header
RawDataDF = RawDataDF.withColumnRenamed("_c0","raw")
#Attempt to split "raw" into 4 columns:
splitDF = RawDataDF.withColumn("split_raw_arr", split("raw", " "))
uDataDF= uDataDF.withColumn('Column A', splitDF.getItem(0))
uDataDF= uDataDF.withColumn('Column B', splitDF.getItem(1))
uDataDF= uDataDF.withColumn('Column C', splitDF.getItem(2))
uDataDF= uDataDF.withColumn('Column D', splitDF.getItem(3))
错误信息:
AttributeError: 'DataFrame' object has no attribute 'getItem'
感谢任何建议。
答案 0 :(得分:1)
使用 split 来创建单独的列是正确的。
但是,您不能直接在数据帧 (getItem
) 上使用 splitDF
,您收到的错误表明了这一点。
此外,您可能错过了问题中 uDataDF
的初始化步骤,并且您正在创建基于 spiltDF
的列值,这在没有 join 的情况下也是不可能的。
withColumn
不允许这样做,因为它需要 Column 类型作为第二个参数。
您可以直接使用 splitDF
创建列并进一步选择要保留的列以创建新的数据框 - uDataDF
input_list = [
(1,"7 6 10")
,(2,"4 59 9")
,(4,"5 00 12")
,(5,"0 10 241")
,(6,"7 19 62")
,(7,"1 42 743")
,(8,"6 23 90")
]
sparkDF = sql.createDataFrame(input_list,['id','raw_str'])
sparkDF = sparkDF.withColumn('A',F.split(F.col('raw_str'),' ').getItem(0).cast(DoubleType()))\
.withColumn('B',F.split(F.col('raw_str'),' ').getItem(1).cast(DoubleType()))\
.withColumn('C',F.split(F.col('raw_str'),' ').getItem(2).cast(DoubleType()))
uDataDF = sparkDF.select(['A','B','C'])
uDataDF.show()
+---+----+-----+
| A| B| C|
+---+----+-----+
|7.0| 6.0| 10.0|
|4.0|59.0| 9.0|
|5.0| 0.0| 12.0|
|0.0|10.0|241.0|
|7.0|19.0| 62.0|
|1.0|42.0|743.0|
|6.0|23.0| 90.0|
+---+----+-----+