1. 程式人生 > >spark RDD的學習,filter函式的學習,split函式的學習

spark RDD的學習,filter函式的學習,split函式的學習

 self.df_judgedoc_info_sample = self.session.read.text(self.judgedoc_info_sample_table_input)

        self.df_judgedoc_info_sample = self.df_judgedoc_info_sample.rdd \
                .filter(lambda line: len((line["value"] or "").split('\t')) == 6)\
            .map(lambda line: Row(**dict(zip(raw_judgedoc_info_field, line["value"
].split('\t')))))\ .toDF() (a) 注意此處len的寫法,為了避免有的時候變數為空,需增加一個 or '' ,構成邏輯變數,為空會自動取 '' ,len('')為0,這樣就不會報錯; In[38]: len('哈哈' or '') Out[38]: 6 In[39]: len( None or '') Out[39]: 0 In[40]: len( None) Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py"
, line 2820, in run_code exec code_obj in self.user_global_ns, self.user_ns File "<ipython-input-40-5cf05113fc33>", line 1, in <module> len( None) TypeError: object of type 'NoneType' has no len() (b)filter(lambda line: len((line["value"] or "").split('\t'))== 6) 結構解讀順序: 首先:(line["value"
] or "").split('\t') 先取line中的value欄位列,spark讀txt檔案的時候預設的列是value命名的,txt存檔案是一行一行地存,預設不分列,因此,當存一些包含漢字欄位的時候,不需要像csv一樣把一行還要解析成多列,有時候解析不準,會出現IndexOutBound,索引越界的錯誤,即誤解析了無窮列,超出了spark處理列的範圍;因此可以用txt儲存,然後用讀txt的方式處理欄位;取split 用\t劃分 In[56]: u'哈哈 你好 哼哼'.split(u'\t') Out[56]: [u'\u54c8\u54c8 \u4f60\u597d \u54fc\u54fc'] 用空格劃分 In[57]: u'哈哈 你好 哼哼'.split(u' ') Out[57]: [u'\u54c8\u54c8', u'\u4f60\u597d', u'', u'', u'\u54fc\u54fc'] In[51]: S = "this is string example....wow!!!" In[52]: print (S.split( )) ['this', 'is', 'string', 'example....wow!!!'] In[53]: print (S.split('i',1)) ['th', 's is string example....wow!!!'] In[54]: print (S.split('w')) ['this is string example....', 'o', '!!!'] In[55]: '哈哈 你好 哼哼'.split(u'\t') str = "Line1-abcdef \nLine2-abc \nLine4-abcd"; print str.split( ); print str.split(' ', 1 ); 結果: ['Line1-abcdef', 'Line2-abc', 'Line4-abcd'] ['Line1-abcdef', '\nLine2-abc \nLine4-abcd'] 上式中1為分隔次數;split還可以指定分隔次數; split('符號'),其作用就是,找到字串中該符號的位置,在該符號的位置加上 ',' 這樣就達到用以分隔前後字元的目的, 然後刪除該符號本身!!!! 然後: 理解filter的作用: filter本質是作用一個bool值,即裡面的函式返回的是一個bool變數: filter(lambda line: len((line["value"] or "").split('\t'))== 6) 正確 裡面的lambda line: len((line["value"] or "").split('\t'))== 6 ,判斷列數為6返回true,否則返回False; 錯誤寫法: filter(lambda line: line.split('\t') if len(line.split('\t')) <7 else None) 這會出現兩個bug:第一),line為空;第二)lambda函式返回的有None值不為TrueFalse,filter只接受true和False

字串的分隔

字串的切割    
 當需要的分隔符是一個是:
    s.split("分隔符")
    當分隔符是多個時:
    s = "abcd,1313|;gg2*hhh"
    方法一:
        將多個分隔符每個每個的拆開分隔
    方法二:
        通過re模組的split()方法
方法一:
 1 def mySplit(s,ds):
 2     res =[s]
 3     for d in ds:
 4         t =[]
 5         map(lambda x:t.extend(x.split(d)),res)
 6         res = t
 7     #當s中存在連續的分隔符時,就會出現空格的,下面是去除空格
 8     return [x for x in res if x]
 9 s = "abcd,1313|;gg2*hhh"
10 res = ',|;*'
11 print(mySplit(s,res))

方法二:
1 In [9]: s = "abcd,1313|;gg2*hhh"
2 
3 In [10]: import re
4 
5 In [11]: re.split('[,|;*]+',s)   #正則表示式[,|;*]中的任何一個出現至少一次
6 Out[11]: ['abcd', '1313', 'gg2', 'hhh']

注意map的用法
dfrdd = df.map(mapper)
dfrdd = df.map(lambda line:mapper(line))

sqlContext = SQLContext(sparkContext=sc)
    df = sqlContext.read.text(hdfspath)
    dfrdd = df.map(mapper)
 此處df的結構為<class 'pyspark.rdd.RDD'>
有的時候,map需要寫lambda,有的時候不需要,依據是判斷當前函式的輸入是不是可以直接用rdd的結構進行輸入,rdd的結構與
dfrdd = df.map(mapper)
print(type(dfrdd))   #<class 'pyspark.rdd.PipelinedRDD'>



Dataframe轉RDD
RDD.map(func)
RDD.map(lambda x : func(x))  
上面兩個的區別;資料結構不一樣?????
piplineRDD has no map

數值和鍵值對RDD
數字型別的RDD支援統計型函式操作,而鍵值對形式的RDD諸如根據鍵聚合的資料的鍵值對操作
把一個普通的RDD轉化為pairRDD,可呼叫map函式實現,pairRDD

ps aux | grep spark

kill 155286
RDD is empty filter本來

相關推薦

spark RDD運算元(一) parallelizemakeRDDtextFile

作者: 翟開順 首發:CSDN parallelize 呼叫SparkContext 的 parallelize(),將一個存在的集合,變成一個RDD,這種方式試用於學習spark和做一些spark的測試 scala版本 def paral

spark RDD學習filter函式學習split函式學習

self.df_judgedoc_info_sample = self.session.read.text(self.judgedoc_info_sample_table_input) self.df_judgedoc_info_samp

ucosII移植學習過程OS_CPU_SR_Save()和OS_CPU_SR_Restore()函式的解析

今天突然興起回顧了一下ucosII,本人在這方面也是小白,但研究了一下,也算有點收穫,在此記錄一下。 我們都知道,程式碼的臨界段,也叫臨界區,指的是處理時不可以分割的程式碼。一旦這部分程式碼開始執行,則不容許任何中斷打斷。為了確保臨界段程式碼的可靠執行,在進入臨界段之前一定要關閉中斷,而臨界段執

Python基礎學習四:for迴圈函式迭代器

12、for迴圈 """ for 變數 in 序列 執行的程式碼塊 """ list01 = ['joe', 'susan', 'jack' ,'Tom'] # 遍歷列表 for i in list01: print(i) pass空操作,無任何意義, pas

Golang學習筆記(十一)函式變數函式作為值使用

Golang中,函式也可以作為一個變數來使用。 寫一個普通函式來讓一段字串,實現大小寫交替顯示: func processCase1(str string) string { result := "" for i, value := range str { if i%2 == 0 {

python學習筆記:lambdafilterreducemap;

一·python中的lambda函式: lambda函式的用法: >>>r = lambda x : x + x >>>r(5) 10 >>>r('s') 'ss' 在lambda的前面要有一個變數名,類似於函式名。

pandas 學習彙總10 - 統計:視窗函式rollingexpanding( tcy)

視窗函式rolling,expanding   2018/12/4            主要用在統計方面。 1.函式 df.rolling(window,

Qt 學習之路 2(19):事件的接受與忽略(當重寫事件回撥函式時刻注意是否需要通過呼叫父類的同名函式來確保原有實現仍能進行!有好幾個例子。為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類中的這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就

函式指標函式指標陣列的學習

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //函式指標的學習 //11_4_1 //11_4-2 //void test() //{ // printf(“hehe\n”); //} //

QT5學習::(轉)非同步函式轉為同步函式的方法(即阻塞函式等待非同步或回撥函式完成)

在QT中,一般推薦使用非同步函式。除了非同步函式的非阻塞特性外,QT的Signal/Slot特性在非同步函式中可以得到充分的發揮。因此,在QT中,很多API的設計都是使用非阻塞的非同步函式作為API,然後執行結果使用Signal返回。使用者執行API後使用slot函式接收反饋結果。

學習筆記--空類虛擬函式虛繼承類的空間大小

//此程式碼在32位win下執行成功#include<iostream>using namespace std;class A//A是空類,編譯器會用一個char型別標記這個類,大小為1{};class B:public A//B繼承了A,但同樣也是空類,大小為1{};class C:virtua

Vuejs2.0學習之二(Render函式,createElementvm.$slots函式化元件模板編譯JSX)

vue中的render函式,我在網上找了很多,下面這一篇文章最詳細 { // 和`v-bind:class`一樣的 API 'class': { foo: true, bar: false }, // 和`v-bind:style`一

python學習筆記:集合set函式基礎

1、遍歷字典     for k,v in d:     則k,v分別是字典中鍵值對的鍵和值 2、字典的推導式     比如d = {x:x**2 for x in range(10)}  &nb

假設你獲取了使用者輸入的日期和時間如2015-1-21 9:01:30以及一個時區資訊如UTC+5:00均是str請編寫一個函式將其轉換為timestamp——python學習筆記

1. 題目: 假設你獲取了使用者輸入的日期和時間如2015-1-21 9:01:30,以及一個時區資訊如UTC+5:00,均是str,請編寫一個函式將其轉換為timestamp。 2. 程式碼如下: import re from datetime import datetime,

Android NDK(JNI)學習總結一:Java程式碼中申明native函式-Java呼叫C函式並在C函式中訪問java類和方法、屬性

本文不涉及android-ndk開發環境搭。 步驟一:新建一個APP,名稱為HelloJNI,然後定義一個類(將會在native程式碼中呼叫和訪問該類): package com.example.hellojni; public class JNITe

OpenCv學習筆記(七)---OpenCv中的基本繪圖函式,圓橢圓線段矩形多邊形的繪製(1)

(一)本節教程的目的 本節你將學到: 1--如何使用Point在影象中定義2D點 2--如何以及為何使用Scalar 3--用OpenCv的函式Line繪直線 4--用OpenCvd的函式ellipse繪製橢圓 5--用OpenCv的函式rectangle繪矩形

學習python第十三天函式5 裝飾器

定義:裝飾器本質是函式,(裝飾其他函式)就是為其他函式新增附加功能原則:1、不能修改被裝飾的函式的原始碼 2、不能修改裝飾的函式的呼叫方式實現裝飾器知識儲備1函式即變數2、高階函式,滿足2個條件之一 1、把一個函式名當做實參傳給另外一個函式。2、返回值中包含函式名(1、在不修改被裝飾的函式的原始碼的情

C/C++程式設計學習筆記二:C語言的函式如何使用指標交換兩個數的值深入理解指標

 使用外部函式交換兩個變數的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指標和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,後兩種是正確的。第四種使

【MFC學習筆記3】ASSERT()函式用法CFileFind Class 說明。

 ASSERT() 函式用法  assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義:  #include <assert.h>  void assert( int expression );  a

黑馬程式設計師----break,continue函式(方法第五天學習筆記

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.      第五天學習內容,迴圈中兩個