sc.textFile()
sc.wholeTextFiles()
sc.textFile(path) 能将path里的所有文件内容读出,以文件中的行作为一条记录的方式。
所有文件的每一行都相当于 List中以 “,”号 隔开的一个元素,因此可以在每个partition中用for i in data的形式遍历处理Array里的数据。
sc.wholeTextFiles(path)返回的是[(K1, V1), (K2, V2)...]的形式,其中K是文件路径,V是文件内容。
这里需要注意官方的一句话:''Each file is read as a single record'' (每个文件作为一个记录)。这说明返回的 V 不是将文件每行拆成一个list的元素,而是将整个文本的内容以字符串的形式读进来,即val = '...line1...\n...line2...\n'。如果还是用for i in val的形式来遍历 val,那么i得到的将是每个字符,因此需要自己去拆分每行。
textFile的partition的数量是与文件夹下的文件数量相关,一个文件就是一个partition(特别提醒:如果每个文件较大,要根据相应切分原则切分)。
wholeTextFiles的partition数量是根据用户指定或者文件大小来确定,与hdfs目录下的文件数量无关。因此wholeTextFiles通常用于读取许多小文件的需求。
# -*- coding: utf-8 -*-
import sys
reload(sys)
import nerspark
sys.setdefaultencoding('utf8')
import os
import json
# 本地spark的路径
os.environ['SPARK_HOME'] = "/user/spark-2.0.1"
sys.path.append("/user/spark-2.0.1/python")
sys.path.append("/user/spark-2.0.1/python/bin")
try:
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
from pyspark.sql import DataFrame
from pyspark.sql import Row
print("Successfully imported Spark Modules")
except ImportError as e:
print("Can not import Spark Modules", e)
sys.exit(1)
from pyspark.sql import SparkSession
# === spark读取文件 ====================================================
# 配置spark(服务器)
# spark = SparkSession.builder.master(服务器_URL).appName("test_script").getOrCreate()
# 配置spark(本机)
spark = SparkSession.builder.master('local').appName("test_script").getOrCreate()
sc = spark.sparkContext
# rdd_data = sc.textFile("xxx.txt") # 文件内容
rdd_data = sc.wholetextFiles("xxx.txt") # 文件path + 内容
result = rdd_data.take(10)
print(result)
print('完成...')