在表格的每一列中拆分列表数据

时间:2019-03-07 10:58:45

标签: list pyspark

将列表数据转换为数据框(表)时遇到问题。 我列表中有数据。(输入)

[['FWD,29052016:09:01,10.56','FWD,29052016:10:53,11.23','FWD,29052016:15:40,23.20'], ['SPOT,29052016:09:04,11.56','FWD,29052016:11:45,11.23','SPOT,29052016:12:30,23.20'], ['FWD,29052016:08:01,10.56','SPOT,29052016:12:30,11.23','FWD,29052016:13:20,23.20','FWD,29052016:14:340,56.00'], ['FWD,29052016:08:01,10.56','SPOT,29052016:12:30,11.23','FWD,29052016:13:20,23.20']]

预期的输出:(表格格式)在pyspark中查看。

FWD 29052016:09:01 10.56
FWD 29052016:10:53 11.23
SPOT 29052016:09:04 11.56

我已经尝试过但不能正常工作。

并行化数据

data1 = sc.parallelize(data)

数据已转换为地图

data_converted = data1.map(lambda x:(x [0] [2],x [1] [1],x [2] [1]))

创建表(createDataFrame)

DF1 = sqlContext.createDataFrame(data_converted,schema)

获得结果 DF1.show()

但获得结果。那不符合我的要求。

产品类型|日期|时间

       D|   F|   F|
       O|   F|   S|

1 个答案:

答案 0 :(得分:0)

此答案假定您仅在您的环境中有权访问pyspark。此外,此答案基于Spark 2.x,并使用了SparkSession(从pyspark.sql导入SparkSession),但是,使用SQLContext时,以前的版本应该达到类似的效果。

此答案以以下方式初始化spark上下文:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("my_app").getOrCreate()

此外,我假设您的数据还不错,并且原始文本文件的每一行都用“ |”分隔。每行只有一个字符串,.txt文件中的每个值都用“,”分隔。

读入文本文件并以“ |”分隔定界符以使其变为可行格式

file = open("/example.txt", "r")
data = file.read().split('|')

然后,我们必须去除空格并用“,”分隔字符串,以便获得列表列表,其中每个内部列表代表您期望的三列格式:

data = [x.strip().split(',') for x in data]

这看起来像这样(请注意,每一行只有一个乘积,日期和时间值):

[['FWD', '29052016:09:01', '10.56'], ['FWD', '29052016:10:53', '11.23']]

如果您的数据有点混乱,并且发现每个“行”都有3个以上的值,则需要使用清理功能以将其转换为正确的格式。

现在,我们为数据框创建架构(为此答案使用字符串):

from pyspark.sql.types import StructField, StructType
schema = StructType(
    [
        StructField("product", StringType(), True),
        StructField("date", StringType(), True),
        StructField("time", StringType(), True)
    ]
)

最后,创建spark数据框:

dataframe = spark.createDataFrame(data, schema)

使用您提供给我的示例的原始版本,结果如​​下:

+-------+---------------+-----+
|product|           date| time|
+-------+---------------+-----+
|    FWD| 29052016:09:01|10.56|
|    FWD| 29052016:10:53|11.23|
|    FWD| 29052016:15:40|23.20|
|   SPOT| 29052016:09:04|11.56|
|    FWD| 29052016:11:45|11.23|
|   SPOT| 29052016:12:30|23.20|
|    FWD| 29052016:08:01|10.56|
|   SPOT| 29052016:12:30|11.23|
|    FWD| 29052016:13:20|23.20|
|    FWD|29052016:14:340|56.00|
|    FWD| 29052016:08:01|10.56|
|   SPOT| 29052016:12:30|11.23|
|    FWD| 29052016:13:20|23.20|
+-------+---------------+-----+